From cf966dd83cfd2bda8778d99cf1b1878d43c448f8 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 8 Nov 2024 11:47:15 +0000 Subject: [PATCH] test(user): write tests for tableName, jsonSchema, relationMappings --- .../models/__snapshots__/user.test.js.snap | 81 ++++++++ packages/backend/src/models/user.test.js | 188 ++++++++++++++++++ 2 files changed, 269 insertions(+) create mode 100644 packages/backend/src/models/__snapshots__/user.test.js.snap create mode 100644 packages/backend/src/models/user.test.js diff --git a/packages/backend/src/models/__snapshots__/user.test.js.snap b/packages/backend/src/models/__snapshots__/user.test.js.snap new file mode 100644 index 00000000..66365834 --- /dev/null +++ b/packages/backend/src/models/__snapshots__/user.test.js.snap @@ -0,0 +1,81 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`User model > jsonSchema should have correct validations 1`] = ` +{ + "properties": { + "createdAt": { + "type": "string", + }, + "deletedAt": { + "type": "string", + }, + "email": { + "format": "email", + "maxLength": 255, + "minLength": 1, + "type": "string", + }, + "fullName": { + "minLength": 1, + "type": "string", + }, + "id": { + "format": "uuid", + "type": "string", + }, + "invitationToken": { + "type": [ + "string", + "null", + ], + }, + "invitationTokenSentAt": { + "format": "date-time", + "type": [ + "string", + "null", + ], + }, + "password": { + "minLength": 6, + "type": "string", + }, + "resetPasswordToken": { + "type": [ + "string", + "null", + ], + }, + "resetPasswordTokenSentAt": { + "format": "date-time", + "type": [ + "string", + "null", + ], + }, + "roleId": { + "format": "uuid", + "type": "string", + }, + "status": { + "default": "active", + "enum": [ + "active", + "invited", + ], + "type": "string", + }, + "trialExpiryDate": { + "type": "string", + }, + "updatedAt": { + "type": "string", + }, + }, + "required": [ + "fullName", + "email", + ], + "type": "object", +} +`; diff --git a/packages/backend/src/models/user.test.js b/packages/backend/src/models/user.test.js new file mode 100644 index 00000000..befbd90b --- /dev/null +++ b/packages/backend/src/models/user.test.js @@ -0,0 +1,188 @@ +import { describe, it, expect, vi } from 'vitest'; +import Base from './base.js'; +import AccessToken from './access-token.js'; +import Connection from './connection.js'; +import Execution from './execution.js'; +import Flow from './flow.js'; +import Identity from './identity.ee.js'; +import Permission from './permission.js'; +import Role from './role.js'; +import Step from './step.js'; +import Subscription from './subscription.ee.js'; +import UsageData from './usage-data.ee.js'; +import User from './user.js'; + +describe('User model', () => { + it('tableName should return correct name', () => { + expect(User.tableName).toBe('users'); + }); + + it('jsonSchema should have correct validations', () => { + expect(User.jsonSchema).toMatchSnapshot(); + }); + + describe('relationMappings', () => { + it('should return correct associations', () => { + const relationMappings = User.relationMappings(); + + const expectedRelations = { + accessTokens: { + relation: Base.HasManyRelation, + modelClass: AccessToken, + join: { + from: 'users.id', + to: 'access_tokens.user_id', + }, + }, + connections: { + relation: Base.HasManyRelation, + modelClass: Connection, + join: { + from: 'users.id', + to: 'connections.user_id', + }, + }, + flows: { + relation: Base.HasManyRelation, + modelClass: Flow, + join: { + from: 'users.id', + to: 'flows.user_id', + }, + }, + steps: { + relation: Base.ManyToManyRelation, + modelClass: Step, + join: { + from: 'users.id', + through: { + from: 'flows.user_id', + to: 'flows.id', + }, + to: 'steps.flow_id', + }, + }, + executions: { + relation: Base.ManyToManyRelation, + modelClass: Execution, + join: { + from: 'users.id', + through: { + from: 'flows.user_id', + to: 'flows.id', + }, + to: 'executions.flow_id', + }, + }, + usageData: { + relation: Base.HasManyRelation, + modelClass: UsageData, + join: { + from: 'usage_data.user_id', + to: 'users.id', + }, + }, + currentUsageData: { + relation: Base.HasOneRelation, + modelClass: UsageData, + join: { + from: 'usage_data.user_id', + to: 'users.id', + }, + filter: expect.any(Function), + }, + subscriptions: { + relation: Base.HasManyRelation, + modelClass: Subscription, + join: { + from: 'subscriptions.user_id', + to: 'users.id', + }, + }, + currentSubscription: { + relation: Base.HasOneRelation, + modelClass: Subscription, + join: { + from: 'subscriptions.user_id', + to: 'users.id', + }, + filter: expect.any(Function), + }, + role: { + relation: Base.HasOneRelation, + modelClass: Role, + join: { + from: 'roles.id', + to: 'users.role_id', + }, + }, + permissions: { + relation: Base.HasManyRelation, + modelClass: Permission, + join: { + from: 'users.role_id', + to: 'permissions.role_id', + }, + }, + identities: { + relation: Base.HasManyRelation, + modelClass: Identity, + join: { + from: 'identities.user_id', + to: 'users.id', + }, + }, + }; + + expect(relationMappings).toStrictEqual(expectedRelations); + }); + + it('currentUsageData should return the current usage data', () => { + const relations = User.relationMappings(); + + const firstSpy = vi.fn(); + + const limitSpy = vi.fn().mockImplementation(() => ({ + first: firstSpy, + })); + + const orderBySpy = vi.fn().mockImplementation(() => ({ + limit: limitSpy, + })); + + relations.currentUsageData.filter({ orderBy: orderBySpy }); + + expect(orderBySpy).toHaveBeenCalledWith('created_at', 'desc'); + expect(limitSpy).toHaveBeenCalledWith(1); + expect(firstSpy).toHaveBeenCalledOnce(); + }); + + it('currentSubscription should return the current subscription', () => { + const relations = User.relationMappings(); + + const firstSpy = vi.fn(); + + const limitSpy = vi.fn().mockImplementation(() => ({ + first: firstSpy, + })); + + const orderBySpy = vi.fn().mockImplementation(() => ({ + limit: limitSpy, + })); + + relations.currentSubscription.filter({ orderBy: orderBySpy }); + + expect(orderBySpy).toHaveBeenCalledWith('created_at', 'desc'); + expect(limitSpy).toHaveBeenCalledWith(1); + expect(firstSpy).toHaveBeenCalledOnce(); + }); + }); + + it('virtualAttributes should return correct attributes', () => { + const virtualAttributes = User.virtualAttributes; + + const expectedAttributes = ['acceptInvitationUrl']; + + expect(virtualAttributes).toStrictEqual(expectedAttributes); + }); +});