File size: 4,308 Bytes
41aafc4
 
 
 
 
 
cfd9177
41aafc4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cfd9177
41aafc4
 
 
 
 
 
cfd9177
2d9b7f1
41aafc4
 
2d9b7f1
41aafc4
 
 
17b18e9
41aafc4
 
2d9b7f1
41aafc4
 
2d9b7f1
41aafc4
 
 
17b18e9
41aafc4
 
cfd9177
2d9b7f1
 
41aafc4
 
cfd9177
41aafc4
 
 
cfd9177
 
41aafc4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17b18e9
41aafc4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
"""
Property-based tests for data models.
Feature: scm-authentication
"""
import pytest
from hypothesis import given, strategies as st, settings
from app.constants.collections import SCM_MERCHANTS_COLLECTION, SCM_staff_COLLECTION


# Strategies for generating test data
merchant_id_strategy = st.text(
    alphabet=st.characters(whitelist_categories=("Lu", "Nd"), whitelist_characters="_"),
    min_size=10,
    max_size=50
)

business_name_strategy = st.text(min_size=3, max_size=100)

email_strategy = st.emails()


@pytest.mark.asyncio
@settings(max_examples=100)
@given(
    merchant_id1=merchant_id_strategy,
    merchant_id2=merchant_id_strategy,
    business_name=business_name_strategy
)
async def test_property_associate_id_uniqueness_per_merchant(
    test_db,
    merchant_id1,
    merchant_id2,
    business_name
):
    """
    Feature: scm-authentication, Property 8: Associate ID uniqueness per merchant
    
    For any two staff within the same merchant, their associate_ids should be unique.
    Validates: Requirements 1.1
    """
    # Skip if merchant_ids are the same (we want to test within same merchant)
    if merchant_id1 == merchant_id2:
        return
    
    # Create two staff with different associate_ids in the same merchant
    staff1 = {
        "associate_id": f"{merchant_id1}_e001",
        "merchant_id": merchant_id1,
        "name": "staff 1",
        "email": "emp1@test.com",
        "mobile": "+11111111111",
        "role_id": "admin",
        "merchant_type": "retail"
    }
    
    staff2 = {
        "associate_id": f"{merchant_id1}_e002",
        "merchant_id": merchant_id1,
        "name": "staff 2",
        "email": "emp2@test.com",
        "mobile": "+12222222222",
        "role_id": "manager",
        "merchant_type": "retail"
    }
    
    # Insert both staff
    await test_db[SCM_staff_COLLECTION].insert_one(staff1)
    await test_db[SCM_staff_COLLECTION].insert_one(staff2)
    
    # Verify both exist
    count = await test_db[SCM_staff_COLLECTION].count_documents({"merchant_id": merchant_id1})
    assert count == 2
    
    # Verify associate_ids are unique
    staff = await test_db[SCM_staff_COLLECTION].find({"merchant_id": merchant_id1}).to_list(None)
    associate_ids = [emp["associate_id"] for emp in staff]
    assert len(associate_ids) == len(set(associate_ids)), "Associate IDs must be unique within a merchant"


@pytest.mark.asyncio
@settings(max_examples=100)
@given(
    business_name1=business_name_strategy,
    business_name2=business_name_strategy,
    merchant_id1=merchant_id_strategy,
    merchant_id2=merchant_id_strategy
)
async def test_property_business_name_uniqueness(
    test_db,
    business_name1,
    business_name2,
    merchant_id1,
    merchant_id2
):
    """
    Feature: scm-authentication, Property 15: Business name uniqueness
    
    For any merchant registration attempt, if the business_name already exists in the
    scm_merchants collection, the system should reject the registration.
    Validates: Requirements 8.2
    """
    # Skip if business names are different (we want to test duplicate scenario)
    if business_name1 != business_name2:
        return
    
    # Skip if merchant_ids are the same
    if merchant_id1 == merchant_id2:
        return
    
    # Create first merchant with business_name1
    merchant1 = {
        "merchant_id": merchant_id1,
        "business_name": business_name1,
        "merchant_type": "retail",
        "country": "US",
        "city": "NYC",
        "area": "Manhattan",
        "contact_name": "Contact 1",
        "contact_email": "contact1@test.com",
        "contact_number": "+11111111111"
    }
    
    await test_db[SCM_MERCHANTS_COLLECTION].insert_one(merchant1)
    
    # Verify first merchant exists
    existing = await test_db[SCM_MERCHANTS_COLLECTION].find_one({"business_name": business_name1})
    assert existing is not None
    
    # Attempt to create second merchant with same business name should be prevented
    # In the actual service, this would raise an error
    # Here we verify that checking for existing business name works
    duplicate_check = await test_db[SCM_MERCHANTS_COLLECTION].find_one({"business_name": business_name2})
    assert duplicate_check is not None, "Duplicate business name should be detected"