mirror of
https://github.com/lordmathis/lemma.git
synced 2025-11-05 15:44:21 +00:00
Compare commits
4 Commits
efdc42cbd7
...
feat/user-
| Author | SHA1 | Date | |
|---|---|---|---|
| 6117f7a58f | |||
| ab6cb47047 | |||
| 4acba662b6 | |||
| 054d9da867 |
@@ -4,6 +4,25 @@ import React from 'react';
|
||||
import { MantineProvider } from '@mantine/core';
|
||||
import ProfileSettings from './ProfileSettings';
|
||||
import type { UserProfileSettings } from '@/types/models';
|
||||
import { Theme, UserRole, type User } from '@/types/models';
|
||||
|
||||
// Mock user for AuthContext
|
||||
const mockUser: User = {
|
||||
id: 1,
|
||||
email: 'test@example.com',
|
||||
displayName: 'Test User',
|
||||
role: UserRole.Editor,
|
||||
theme: Theme.Dark,
|
||||
createdAt: '2024-01-01T00:00:00Z',
|
||||
lastWorkspaceId: 1,
|
||||
};
|
||||
|
||||
// Mock the auth context
|
||||
vi.mock('../../../contexts/AuthContext', () => ({
|
||||
useAuth: () => ({
|
||||
user: mockUser,
|
||||
}),
|
||||
}));
|
||||
|
||||
// Helper wrapper component for testing
|
||||
const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import React from 'react';
|
||||
import { Box, Stack, TextInput, Group, Text, Switch } from '@mantine/core';
|
||||
import { IconMoon, IconSun } from '@tabler/icons-react';
|
||||
import { useAuth } from '@/contexts/AuthContext';
|
||||
import { Theme, type UserProfileSettings } from '@/types/models';
|
||||
|
||||
@@ -44,24 +43,21 @@ const ProfileSettings: React.FC<ProfileSettingsProps> = ({
|
||||
placeholder="Enter email"
|
||||
data-testid="email-input"
|
||||
/>
|
||||
<Group justify="space-between" align="flex-start">
|
||||
<div>
|
||||
<Text size="sm" fw={500}>
|
||||
Default Theme
|
||||
</Text>
|
||||
<Text size="xs" c="dimmed">
|
||||
Sets the default theme for new workspaces
|
||||
</Text>
|
||||
</div>
|
||||
<Switch
|
||||
checked={currentTheme === Theme.Dark}
|
||||
onChange={handleThemeToggle}
|
||||
size="lg"
|
||||
onLabel={<IconMoon size={16} />}
|
||||
offLabel={<IconSun size={16} />}
|
||||
data-testid="theme-toggle"
|
||||
/>
|
||||
</Group>
|
||||
<Box mb="md">
|
||||
<Group justify="space-between" align="center">
|
||||
<div>
|
||||
<Text size="sm">Default Dark Mode</Text>
|
||||
<Text size="xs" c="dimmed">
|
||||
Sets the default theme for new workspaces
|
||||
</Text>
|
||||
</div>
|
||||
<Switch
|
||||
checked={currentTheme === Theme.Dark}
|
||||
onChange={handleThemeToggle}
|
||||
data-testid="theme-toggle"
|
||||
/>
|
||||
</Group>
|
||||
</Box>
|
||||
</Stack>
|
||||
</Box>
|
||||
);
|
||||
|
||||
@@ -188,6 +188,7 @@ describe('Models Type Guards', () => {
|
||||
id: 1,
|
||||
email: 'test@example.com',
|
||||
role: UserRole.Editor,
|
||||
theme: Theme.Dark,
|
||||
createdAt: '2024-01-01T00:00:00Z',
|
||||
lastWorkspaceId: 1,
|
||||
__proto__: { malicious: true },
|
||||
@@ -773,6 +774,7 @@ describe('Models Type Guards', () => {
|
||||
id: 1,
|
||||
email: 'test@example.com',
|
||||
role: UserRole.Editor,
|
||||
theme: Theme.Dark,
|
||||
createdAt: '2024-01-01T00:00:00Z',
|
||||
lastWorkspaceId: 1,
|
||||
};
|
||||
@@ -806,6 +808,7 @@ describe('Models Type Guards', () => {
|
||||
id: 1,
|
||||
email: 'test@example.com',
|
||||
role: UserRole.Editor,
|
||||
theme: Theme.Dark,
|
||||
createdAt: '2024-01-01T00:00:00Z',
|
||||
lastWorkspaceId: 1,
|
||||
});
|
||||
@@ -854,6 +857,7 @@ describe('Models Type Guards', () => {
|
||||
id: 1,
|
||||
email: longString,
|
||||
role: UserRole.Editor,
|
||||
theme: Theme.Dark,
|
||||
createdAt: '2024-01-01T00:00:00Z',
|
||||
lastWorkspaceId: 1,
|
||||
};
|
||||
|
||||
@@ -30,7 +30,8 @@ export function isUser(value: unknown): value is User {
|
||||
'role' in value &&
|
||||
isUserRole((value as User).role) &&
|
||||
'theme' in value &&
|
||||
(value as User).theme in Theme &&
|
||||
typeof (value as User).theme === 'string' &&
|
||||
Object.values(Theme).includes((value as User).theme) &&
|
||||
'createdAt' in value &&
|
||||
typeof (value as User).createdAt === 'string' &&
|
||||
'lastWorkspaceId' in value &&
|
||||
|
||||
@@ -29,6 +29,7 @@ func TestSessionOperations(t *testing.T) {
|
||||
DisplayName: "Test User",
|
||||
PasswordHash: "hash",
|
||||
Role: "editor",
|
||||
Theme: "dark",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create test user: %v", err)
|
||||
|
||||
@@ -156,6 +156,7 @@ func TestStructQueries(t *testing.T) {
|
||||
DisplayName: "Struct Query Test",
|
||||
PasswordHash: "hashed_password",
|
||||
Role: models.RoleEditor,
|
||||
Theme: "dark",
|
||||
}
|
||||
|
||||
t.Run("InsertStructQuery", func(t *testing.T) {
|
||||
@@ -243,6 +244,7 @@ func TestStructQueries(t *testing.T) {
|
||||
DisplayName: "Struct Query Test 2",
|
||||
PasswordHash: "hashed_password2",
|
||||
Role: models.RoleViewer,
|
||||
Theme: "light",
|
||||
}
|
||||
|
||||
createdUser2, err := database.CreateUser(secondUser)
|
||||
@@ -437,6 +439,7 @@ func TestEncryptedFields(t *testing.T) {
|
||||
DisplayName: "Encryption Test",
|
||||
PasswordHash: "hash",
|
||||
Role: models.RoleEditor,
|
||||
Theme: "dark",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create test user: %v", err)
|
||||
|
||||
@@ -31,12 +31,14 @@ func TestSystemOperations(t *testing.T) {
|
||||
DisplayName: "User 1",
|
||||
PasswordHash: "hash1",
|
||||
Role: "editor",
|
||||
Theme: "dark",
|
||||
},
|
||||
{
|
||||
Email: "user2@test.com",
|
||||
DisplayName: "User 2",
|
||||
PasswordHash: "hash2",
|
||||
Role: "viewer",
|
||||
Theme: "light",
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ func TestUserOperations(t *testing.T) {
|
||||
DisplayName: "Test User",
|
||||
PasswordHash: "hashed_password",
|
||||
Role: models.RoleEditor,
|
||||
Theme: "dark",
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
@@ -44,6 +45,7 @@ func TestUserOperations(t *testing.T) {
|
||||
DisplayName: "Another User",
|
||||
PasswordHash: "different_hash",
|
||||
Role: models.RoleViewer,
|
||||
Theme: "light",
|
||||
},
|
||||
wantErr: true,
|
||||
errContains: "UNIQUE constraint failed",
|
||||
@@ -108,6 +110,7 @@ func TestUserOperations(t *testing.T) {
|
||||
DisplayName: "Get By ID User",
|
||||
PasswordHash: "hash",
|
||||
Role: models.RoleEditor,
|
||||
Theme: "dark",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create test user: %v", err)
|
||||
@@ -159,6 +162,7 @@ func TestUserOperations(t *testing.T) {
|
||||
DisplayName: "Get By Email User",
|
||||
PasswordHash: "hash",
|
||||
Role: models.RoleEditor,
|
||||
Theme: "dark",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create test user: %v", err)
|
||||
@@ -210,6 +214,7 @@ func TestUserOperations(t *testing.T) {
|
||||
DisplayName: "Original Name",
|
||||
PasswordHash: "original_hash",
|
||||
Role: models.RoleEditor,
|
||||
Theme: "dark",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create test user: %v", err)
|
||||
@@ -249,12 +254,14 @@ func TestUserOperations(t *testing.T) {
|
||||
DisplayName: "User One",
|
||||
PasswordHash: "hash1",
|
||||
Role: models.RoleEditor,
|
||||
Theme: "dark",
|
||||
},
|
||||
{
|
||||
Email: "user2@example.com",
|
||||
DisplayName: "User Two",
|
||||
PasswordHash: "hash2",
|
||||
Role: models.RoleViewer,
|
||||
Theme: "light",
|
||||
},
|
||||
}
|
||||
|
||||
@@ -305,6 +312,7 @@ func TestUserOperations(t *testing.T) {
|
||||
DisplayName: "Workspace User",
|
||||
PasswordHash: "hash",
|
||||
Role: models.RoleEditor,
|
||||
Theme: "dark",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create test user: %v", err)
|
||||
@@ -343,6 +351,7 @@ func TestUserOperations(t *testing.T) {
|
||||
DisplayName: "Delete User",
|
||||
PasswordHash: "hash",
|
||||
Role: models.RoleEditor,
|
||||
Theme: "dark",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create test user: %v", err)
|
||||
@@ -377,18 +386,21 @@ func TestUserOperations(t *testing.T) {
|
||||
DisplayName: "Admin One",
|
||||
PasswordHash: "hash1",
|
||||
Role: models.RoleAdmin,
|
||||
Theme: "dark",
|
||||
},
|
||||
{
|
||||
Email: "admin2@example.com",
|
||||
DisplayName: "Admin Two",
|
||||
PasswordHash: "hash2",
|
||||
Role: models.RoleAdmin,
|
||||
Theme: "light",
|
||||
},
|
||||
{
|
||||
Email: "editor@example.com",
|
||||
DisplayName: "Editor",
|
||||
PasswordHash: "hash3",
|
||||
Role: models.RoleEditor,
|
||||
Theme: "dark",
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ func TestWorkspaceOperations(t *testing.T) {
|
||||
DisplayName: "Test User",
|
||||
PasswordHash: "hash",
|
||||
Role: models.RoleEditor,
|
||||
Theme: "dark",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create test user: %v", err)
|
||||
|
||||
@@ -213,6 +213,7 @@ func (h *testHarness) createTestUser(t *testing.T, email, password string, role
|
||||
DisplayName: "Test User",
|
||||
PasswordHash: string(hashedPassword),
|
||||
Role: role,
|
||||
Theme: "dark",
|
||||
}
|
||||
|
||||
user, err = h.DB.CreateUser(user)
|
||||
|
||||
Reference in New Issue
Block a user