chore: sync all local changes and new files

- Update next.config.ts
- Add netlify.toml, Docker configs, e2e tests
- Add env templates, docs (README, ROADMAP, TODO)
- Add vitest/playwright test configs
- Add component and lib tests
- Add install script, portainer env template
- Update .gitignore (tsbuildinfo, deno.lock, dev.db)
This commit is contained in:
FalahMobile
2026-07-02 20:01:48 +08:00
parent 2e66def057
commit 61baf3ac5d
25 changed files with 2456 additions and 2 deletions
+76
View File
@@ -0,0 +1,76 @@
import { describe, it, expect } from 'vitest'
describe('Auth Utilities', () => {
describe('Email validation', () => {
// Assuming validateEmail is in the auth utility
const validateEmail = (email: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)
it('should return true for valid emails', () => {
expect(validateEmail('test@example.com')).toBe(true)
expect(validateEmail('user.name+tag@example.co.uk')).toBe(true)
})
it('should return false for invalid emails', () => {
expect(validateEmail('invalid-email')).toBe(false)
expect(validateEmail('test@.com')).toBe(false)
expect(validateEmail('@example.com')).toBe(false)
})
})
describe('Password strength', () => {
// Assuming checkPasswordStrength is in the auth utility
const checkPasswordStrength = (pass: string) => {
if (pass.length < 8) return 'weak'
if (!/[A-Z]/.test(pass) || !/[0-9]/.test(pass) || !/[^a-zA-Z0-9]/.test(pass)) return 'medium'
return 'strong'
}
it('should return weak for passwords under 8 characters', () => {
expect(checkPasswordStrength('pass')).toBe('weak')
})
it('should return medium for passwords without symbols or numbers', () => {
expect(checkPasswordStrength('password123')).toBe('medium')
})
it('should return strong for passwords with mixed case, numbers, and symbols', () => {
expect(checkPasswordStrength('StrongPass123!')).toBe('strong')
})
})
describe('Login/Logout operations', () => {
it('should handle login successfully with correct credentials', async () => {
// Mock login function
const login = async (user: string, pass: string) => {
if (user === 'user@example.com' && pass === 'password') {
return { success: true, token: 'fake-jwt-token' }
}
return { success: false }
}
const result = await login('user@example.com', 'password')
expect(result.success).toBe(true)
expect(result).toHaveProperty('token', 'fake-jwt-token')
})
it('should fail login with incorrect credentials', async () => {
const login = async (user: string, pass: string) => {
if (user === 'user@example.com' && pass === 'password') {
return { success: true, token: 'fake-jwt-token' }
}
return { success: false }
}
const result = await login('user@example.com', 'wrongpassword')
expect(result.success).toBe(false)
})
it('should handle logout successfully', async () => {
// Mock logout function
const logout = async () => true
const result = await logout()
expect(result).toBe(true)
})
})
})