File size: 11,615 Bytes
c024705
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
923dca5
c024705
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c1ce623
c024705
923dca5
c024705
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AIMHSA Registration Validation Test</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            background: #f5f5f5;
        }
        .test-section {
            background: white;
            padding: 20px;
            margin: 20px 0;
            border-radius: 8px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        .test-case {
            margin: 10px 0;
            padding: 10px;
            border-left: 4px solid #ddd;
        }
        .test-case.pass {
            border-left-color: #10b981;
            background: #f0fdf4;
        }
        .test-case.fail {
            border-left-color: #ef4444;
            background: #fef2f2;
        }
        .test-input {
            width: 100%;
            padding: 8px;
            margin: 5px 0;
            border: 1px solid #ddd;
            border-radius: 4px;
        }
        .test-button {
            background: #7c3aed;
            color: white;
            border: none;
            padding: 10px 20px;
            border-radius: 4px;
            cursor: pointer;
            margin: 5px;
        }
        .test-button:hover {
            background: #5b21b6;
        }
        .result {
            margin: 10px 0;
            padding: 10px;
            border-radius: 4px;
        }
        .result.success {
            background: #d1fae5;
            color: #065f46;
            border: 1px solid #10b981;
        }
        .result.error {
            background: #fee2e2;
            color: #991b1b;
            border: 1px solid #ef4444;
        }
    </style>
</head>
<body>
    <h1>πŸ§ͺ AIMHSA Registration Validation Test Suite</h1>
    <p>This page tests the comprehensive validation implemented for the registration form at <code>https://prodevroger-ishingiro.hf.space/register</code></p>

    <div class="test-section">
        <h2>πŸ“‹ Validation Features Implemented</h2>
        <ul>
            <li><strong>Username Validation:</strong> 3-50 characters, alphanumeric + underscore only, no reserved words</li>
            <li><strong>Email Validation:</strong> Proper email format, max 100 characters, domain validation</li>
            <li><strong>Full Name Validation:</strong> 2-100 characters, letters/spaces/hyphens/apostrophes/periods only, minimum 2 words</li>
            <li><strong>Phone Validation:</strong> Rwanda format (+250XXXXXXXXX or 07XXXXXXXX), prefix validation</li>
            <li><strong>Province/District Validation:</strong> Required selection, district depends on province</li>
            <li><strong>Password Validation:</strong> 8-128 characters, letters + numbers required, weak password detection</li>
            <li><strong>Password Confirmation:</strong> Must match original password</li>
            <li><strong>Terms Agreement:</strong> Must be checked</li>
            <li><strong>Real-time Validation:</strong> Live feedback as user types</li>
            <li><strong>Password Strength Indicator:</strong> Visual strength meter</li>
        </ul>
    </div>

    <div class="test-section">
        <h2>πŸ” Test Cases</h2>
        
        <div class="test-case">
            <h3>Username Tests</h3>
            <input type="text" class="test-input" id="usernameTest" placeholder="Test username">
            <button class="test-button" onclick="testUsername()">Test Username</button>
            <div id="usernameResult" class="result" style="display: none;"></div>
        </div>

        <div class="test-case">
            <h3>Email Tests</h3>
            <input type="email" class="test-input" id="emailTest" placeholder="Test email">
            <button class="test-button" onclick="testEmail()">Test Email</button>
            <div id="emailResult" class="result" style="display: none;"></div>
        </div>

        <div class="test-case">
            <h3>Phone Tests</h3>
            <input type="tel" class="test-input" id="phoneTest" placeholder="Test phone (+250XXXXXXXXX)">
            <button class="test-button" onclick="testPhone()">Test Phone</button>
            <div id="phoneResult" class="result" style="display: none;"></div>
        </div>

        <div class="test-case">
            <h3>Password Tests</h3>
            <input type="password" class="test-input" id="passwordTest" placeholder="Test password">
            <button class="test-button" onclick="testPassword()">Test Password</button>
            <div id="passwordResult" class="result" style="display: none;"></div>
        </div>
    </div>

    <div class="test-section">
        <h2>βœ… Expected Validation Results</h2>
        
        <h3>Valid Inputs (Should Pass)</h3>
        <ul>
            <li><strong>Username:</strong> <code>john_doe123</code>, <code>user123</code>, <code>test_user</code></li>
            <li><strong>Email:</strong> <code>john@example.com</code>, <code>user@gmail.com</code>, <code>test@domain.co.rw</code></li>
            <li><strong>Full Name:</strong> <code>John Doe</code>, <code>Marie-Claire Ntwari</code>, <code>Dr. Jean Baptiste</code></li>
            <li><strong>Phone:</strong> <code>+250788123456</code>, <code>0788123456</code>, <code>+250789123456</code></li>
            <li><strong>Password:</strong> <code>Password123</code>, <code>MySecure123</code>, <code>StrongPass2024</code></li>
        </ul>

        <h3>Invalid Inputs (Should Fail)</h3>
        <ul>
            <li><strong>Username:</strong> <code>ab</code> (too short), <code>user@name</code> (invalid chars), <code>admin</code> (reserved)</li>
            <li><strong>Email:</strong> <code>invalid-email</code> (no @), <code>user@</code> (incomplete), <code>@domain.com</code> (no user)</li>
            <li><strong>Full Name:</strong> <code>J</code> (too short), <code>John123</code> (numbers), <code>John@Doe</code> (invalid chars)</li>
            <li><strong>Phone:</strong> <code>123456</code> (wrong format), <code>+1234567890</code> (wrong country), <code>078123</code> (too short)</li>
            <li><strong>Password:</strong> <code>123456</code> (too short), <code>password</code> (no numbers), <code>12345678</code> (no letters)</li>
        </ul>
    </div>

    <div class="test-section">
        <h2>πŸš€ How to Test</h2>
        <ol>
            <li>Start the AIMHSA server: <code>python app.py</code> (port 7060)</li>
            <li>Start the frontend server: <code>python run_frontend.py</code> (port 8000)</li>
            <li>Open <code>https://prodevroger-ishingiro.hf.space/register</code> in your browser</li>
            <li>Test each field with valid and invalid inputs</li>
            <li>Verify real-time validation feedback</li>
            <li>Test password strength indicator</li>
            <li>Test province/district dependency</li>
            <li>Test form submission with various combinations</li>
        </ol>
    </div>

    <div class="test-section">
        <h2>πŸ“± Mobile Testing</h2>
        <p>Test the registration form on mobile devices to ensure:</p>
        <ul>
            <li>Form fields are properly sized for mobile screens</li>
            <li>Validation messages are readable on small screens</li>
            <li>Touch interactions work correctly</li>
            <li>Keyboard types are appropriate (email, tel, etc.)</li>
        </ul>
    </div>

    <script>
        // Test functions (simplified versions of the actual validation)
        function testUsername() {
            const username = document.getElementById('usernameTest').value;
            const result = document.getElementById('usernameResult');
            
            let error = null;
            if (!username || username.trim() === '') {
                error = 'Username is required';
            } else if (username.length < 3) {
                error = 'Username must be at least 3 characters';
            } else if (username.length > 50) {
                error = 'Username must be less than 50 characters';
            } else if (!/^[a-zA-Z0-9_]+$/.test(username)) {
                error = 'Username can only contain letters, numbers, and underscores';
            }
            
            if (error) {
                result.className = 'result error';
                result.textContent = '❌ ' + error;
            } else {
                result.className = 'result success';
                result.textContent = 'βœ… Username is valid';
            }
            result.style.display = 'block';
        }

        function testEmail() {
            const email = document.getElementById('emailTest').value;
            const result = document.getElementById('emailResult');
            
            let error = null;
            if (!email || email.trim() === '') {
                error = 'Email is required';
            } else if (email.length > 100) {
                error = 'Email must be less than 100 characters';
            } else if (!/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(email)) {
                error = 'Please enter a valid email address';
            }
            
            if (error) {
                result.className = 'result error';
                result.textContent = '❌ ' + error;
            } else {
                result.className = 'result success';
                result.textContent = 'βœ… Email is valid';
            }
            result.style.display = 'block';
        }

        function testPhone() {
            const phone = document.getElementById('phoneTest').value;
            const result = document.getElementById('phoneResult');
            
            let error = null;
            if (!phone || phone.trim() === '') {
                error = 'Phone number is required';
            } else if (!/^(\+250|0)[0-9]{9}$/.test(phone)) {
                error = 'Please enter a valid Rwanda phone number (+250XXXXXXXXX or 07XXXXXXXX)';
            }
            
            if (error) {
                result.className = 'result error';
                result.textContent = '❌ ' + error;
            } else {
                result.className = 'result success';
                result.textContent = 'βœ… Phone number is valid';
            }
            result.style.display = 'block';
        }

        function testPassword() {
            const password = document.getElementById('passwordTest').value;
            const result = document.getElementById('passwordResult');
            
            let error = null;
            if (!password || password === '') {
                error = 'Password is required';
            } else if (password.length < 8) {
                error = 'Password must be at least 8 characters long';
            } else if (password.length > 128) {
                error = 'Password must be less than 128 characters';
            } else if (!/[a-zA-Z]/.test(password)) {
                error = 'Password must contain at least one letter';
            } else if (!/[0-9]/.test(password)) {
                error = 'Password must contain at least one number';
            }
            
            if (error) {
                result.className = 'result error';
                result.textContent = '❌ ' + error;
            } else {
                result.className = 'result success';
                result.textContent = 'βœ… Password is valid';
            }
            result.style.display = 'block';
        }
    </script>
</body>
</html>