Files
colanode/apps/server/test/api/account.test.ts

106 lines
2.6 KiB
TypeScript

import { afterAll, beforeAll, describe, expect, it } from 'vitest';
import { ApiHeader, UserStatus } from '@colanode/core';
import { database } from '@colanode/server/data/database';
import { buildTestApp } from '../helpers/app';
import {
buildAuthHeader,
createAccount,
createDevice,
createUser,
createWorkspace,
} from '../helpers/seed';
const CLIENT_PLATFORM = 'test-platform';
const CLIENT_VERSION = '1.2.3';
const CLIENT_TYPE = 'web';
const CLIENT_IP = '203.0.113.10';
const app = buildTestApp();
beforeAll(async () => {
await app.ready();
});
afterAll(async () => {
await app.close();
});
describe('POST /client/v1/accounts/sync', () => {
it('returns only active workspaces and updates device metadata', async () => {
const account = await createAccount({
email: 'sync@example.com',
password: 'Password123!',
});
const workspace = await createWorkspace({
createdBy: account.id,
});
await createUser({
workspaceId: workspace.id,
account,
role: 'owner',
});
const hiddenWorkspace = await createWorkspace({
createdBy: account.id,
name: 'Hidden Workspace',
});
await createUser({
workspaceId: hiddenWorkspace.id,
account,
role: 'none',
});
const removedWorkspace = await createWorkspace({
createdBy: account.id,
name: 'Removed Workspace',
});
await createUser({
workspaceId: removedWorkspace.id,
account,
role: 'collaborator',
status: UserStatus.Removed,
});
const { device, token } = await createDevice({ accountId: account.id });
const response = await app.inject({
method: 'POST',
url: '/client/v1/accounts/sync',
headers: {
...buildAuthHeader(token),
[ApiHeader.ClientPlatform]: CLIENT_PLATFORM,
[ApiHeader.ClientVersion]: CLIENT_VERSION,
[ApiHeader.ClientType]: CLIENT_TYPE,
'x-forwarded-for': CLIENT_IP,
},
});
expect(response.statusCode).toBe(200);
const body = response.json() as {
account: { id: string };
workspaces: { id: string }[];
};
expect(body.account.id).toBe(account.id);
expect(body.workspaces).toHaveLength(1);
expect(body.workspaces[0]?.id).toBe(workspace.id);
const updatedDevice = await database
.selectFrom('devices')
.selectAll()
.where('id', '=', device.id)
.executeTakeFirst();
expect(updatedDevice?.synced_at).not.toBeNull();
expect(updatedDevice?.platform).toBe(CLIENT_PLATFORM);
expect(updatedDevice?.version).toBe(CLIENT_VERSION);
expect(updatedDevice?.ip).toBe(CLIENT_IP);
});
});