feat: wrap article and user service functions with TypedResult for improved error handling

This commit is contained in:
2026-04-11 01:48:09 -03:00
parent 94e8058880
commit af17b6dc5a
10 changed files with 363 additions and 240 deletions

View File

@@ -35,14 +35,15 @@ describe('UserService', () => {
role: 'user',
};
const savedUser = await saveUser(userToSave);
const result = await saveUser(userToSave);
expect(savedUser.id).toBeDefined();
expect(savedUser.name).toBe(userToSave.name);
expect(savedUser.email).toBe(userToSave.email);
expect(savedUser.role).toBe(userToSave.role);
expect(savedUser.role).toBe(userToSave.role);
expect(savedUser.externalId).toBeDefined(); // Default to true if not set
expect(result.ok).toBe(true);
if (!result.ok) return;
expect(result.value.id).toBeDefined();
expect(result.value.name).toBe(userToSave.name);
expect(result.value.email).toBe(userToSave.email);
expect(result.value.role).toBe(userToSave.role);
expect(result.value.externalId).toBeDefined();
});
test('cannot save user with existing email', async () => {
@@ -51,23 +52,31 @@ describe('UserService', () => {
email: 'test@email.com',
role: 'user',
};
await expect(saveUser(userToSave)).rejects.toThrow(
`User with email ${userToSave.email} already exists`
);
const result = await saveUser(userToSave);
expect(result.ok).toBe(false);
if (result.ok) return;
expect(result.error.message).toContain(userToSave.email);
});
test('can getUserByEmail', async () => {
const user = await getUserByEmail('test@email.com');
const result = await getUserByEmail('test@email.com');
expect(user).toBeDefined();
expect(user?.email).toBe('test@email.com');
expect(user?.name).toBe('Test User');
expect(user?.role).toBe('user');
expect(user?.externalId).toBeDefined(); // Default to true if not set
expect(result.ok).toBe(true);
if (!result.ok) return;
expect(result.value?.email).toBe('test@email.com');
expect(result.value?.name).toBe('Test User');
expect(result.value?.role).toBe('user');
expect(result.value?.externalId).toBeDefined();
});
test('cannot getUserByEmail with non-existing email', async () => {
await expect(getUserByEmail('missing@email.com')).resolves.toBeNull();
const result = await getUserByEmail('missing@email.com');
expect(result.ok).toBe(true);
if (!result.ok) return;
expect(result.value).toBeNull();
});
test('can update user', async () => {
@@ -76,17 +85,21 @@ describe('UserService', () => {
role: 'admin',
};
const user = await getUserByEmail('test@email.com');
const userResult = await getUserByEmail('test@email.com');
expect(userResult.ok).toBe(true);
if (!userResult.ok) return;
const user = userResult.value;
expect(user).toBeDefined();
const updatedUser = await updateUser(user!.id, dataToUpdate);
const result = await updateUser(user!.id, dataToUpdate);
expect(updatedUser).toBeDefined();
expect(updatedUser.id).toBe(user!.id);
expect(updatedUser.name).toBe(dataToUpdate.name);
expect(updatedUser.role).toBe(dataToUpdate.role);
expect(updatedUser.email).toBe(user!.email);
expect(updatedUser.externalId).toBeDefined(); // Default to true if not set
expect(result.ok).toBe(true);
if (!result.ok) return;
expect(result.value.id).toBe(user!.id);
expect(result.value.name).toBe(dataToUpdate.name);
expect(result.value.role).toBe(dataToUpdate.role);
expect(result.value.email).toBe(user!.email);
expect(result.value.externalId).toBeDefined();
});
test('cannot update non-existing user', async () => {
@@ -95,9 +108,11 @@ describe('UserService', () => {
role: 'admin',
};
await expect(updateUser('9999', dataToUpdate)).rejects.toThrow(
`User with ID 9999 not found`
);
const result = await updateUser('9999', dataToUpdate);
expect(result.ok).toBe(false);
if (result.ok) return;
expect(result.error.message).toContain('9999');
});
test('can sync admin user', async () => {
@@ -131,12 +146,14 @@ describe('UserService', () => {
},
},
} as SessionClaims;
const syncedUser = await syncUser(sessionClaims);
expect(syncedUser).toBeDefined();
expect(syncedUser.name).toBe('Updated Name');
expect(syncedUser.email).toBe('test@email.com');
expect(syncedUser.role).toBe('admin');
const result = await syncUser(sessionClaims);
expect(result.ok).toBe(true);
if (!result.ok) return;
expect(result.value.name).toBe('Updated Name');
expect(result.value.email).toBe('test@email.com');
expect(result.value.role).toBe('admin');
});
test('can sync internal user', async () => {
@@ -170,12 +187,14 @@ describe('UserService', () => {
},
},
} as SessionClaims;
const syncedUser = await syncUser(sessionClaims);
expect(syncedUser).toBeDefined();
expect(syncedUser.name).toBe('Updated Name');
expect(syncedUser.email).toBe('test@email.com');
expect(syncedUser.role).toBe('internal');
const result = await syncUser(sessionClaims);
expect(result.ok).toBe(true);
if (!result.ok) return;
expect(result.value.name).toBe('Updated Name');
expect(result.value.email).toBe('test@email.com');
expect(result.value.role).toBe('internal');
});
test('can sync user', async () => {
@@ -202,12 +221,14 @@ describe('UserService', () => {
},
},
} as SessionClaims;
const syncedUser = await syncUser(sessionClaims);
expect(syncedUser).toBeDefined();
expect(syncedUser.name).toBe('Updated Name');
expect(syncedUser.email).toBe('test@email.com');
expect(syncedUser.role).toBe('user');
const result = await syncUser(sessionClaims);
expect(result.ok).toBe(true);
if (!result.ok) return;
expect(result.value.name).toBe('Updated Name');
expect(result.value.email).toBe('test@email.com');
expect(result.value.role).toBe('user');
});
test('can sync saving new user', async () => {
@@ -234,11 +255,13 @@ describe('UserService', () => {
},
},
} as SessionClaims;
const syncedUser = await syncUser(sessionClaims);
expect(syncedUser).toBeDefined();
expect(syncedUser.name).toBe('Updated Name');
expect(syncedUser.email).toBe('new@email.com');
expect(syncedUser.role).toBe('user');
const result = await syncUser(sessionClaims);
expect(result.ok).toBe(true);
if (!result.ok) return;
expect(result.value.name).toBe('Updated Name');
expect(result.value.email).toBe('new@email.com');
expect(result.value.role).toBe('user');
});
});