Skip to content

Commit

Permalink
fix ProjectRepository.getPersonalProjectForUser[OrFail]
Browse files Browse the repository at this point in the history
It was not taking the type of the project and the role the user has to the project into account.
  • Loading branch information
despairblue committed Feb 20, 2024
1 parent 674abd8 commit a278f59
Show file tree
Hide file tree
Showing 2 changed files with 149 additions and 2 deletions.
8 changes: 6 additions & 2 deletions packages/cli/src/databases/repositories/project.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,14 @@ export class ProjectRepository extends Repository<Project> {
}

async getPersonalProjectForUser(userId: string) {
return await this.findOne({ where: { projectRelations: { userId } } });
return await this.findOne({
where: { type: 'personal', projectRelations: { userId, role: 'project:personalOwner' } },
});
}

async getPersonalProjectForUserOrFail(userId: string) {
return await this.findOneOrFail({ where: { projectRelations: { userId } } });
return await this.findOneOrFail({
where: { type: 'personal', projectRelations: { userId, role: 'project:personalOwner' } },
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import Container from 'typedi';
import { createOwner } from '../../shared/db/users';
import * as testDb from '../../shared/testDb';
import { ProjectRepository } from '@/databases/repositories/project.repository';
import type { DeepPartial } from 'ts-essentials';
import type { Project } from '@/databases/entities/Project';
import { ProjectRelationRepository } from '@/databases/repositories/projectRelation.repository';
import { User } from '@/databases/entities/User';

Check failure on line 8 in packages/cli/test/integration/database/repositories/project.repository.test.ts

View workflow job for this annotation

GitHub Actions / Lint changes

All imports in the declaration are only used as types. Use `import type`
import { createPromptModule } from 'inquirer';

Check failure on line 9 in packages/cli/test/integration/database/repositories/project.repository.test.ts

View workflow job for this annotation

GitHub Actions / Lint changes

'createPromptModule' is defined but never used
import { ApplicationError } from 'n8n-workflow';

Check failure on line 10 in packages/cli/test/integration/database/repositories/project.repository.test.ts

View workflow job for this annotation

GitHub Actions / Lint changes

'ApplicationError' is defined but never used
import { EntityNotFoundError } from '@n8n/typeorm';

describe('ProjectRepository', () => {
beforeAll(async () => {
await testDb.init();
});

beforeEach(async () => {
await testDb.truncate(['User', 'Workflow', 'Project']);
});

afterAll(async () => {
await testDb.terminate();
});

async function createProject(user: User, project?: DeepPartial<Project>) {
const projectRepository = Container.get(ProjectRepository);
const projectRelationRepository = Container.get(ProjectRelationRepository);

const savedProject = await projectRepository.save<Project>(
projectRepository.create({
name: 'project name',
type: 'team',
...project,
}),
);
await projectRelationRepository.save(
projectRelationRepository.create({
userId: user.id,
projectId: savedProject.id,
role: 'project:personalOwner',
}),
);

return savedProject;
}

describe('getPersonalProjectForUser', () => {
it('returns the personal project', async () => {
//
// ARRANGE
//
const owner = await createOwner();
const ownerPersonalProject = await Container.get(ProjectRepository).findOneByOrFail({
projectRelations: { userId: owner.id },
});

//
// ACT
//
const personalProject = await Container.get(ProjectRepository).getPersonalProjectForUser(
owner.id,
);

//
// ASSERT
//
if (!personalProject) {
fail('Expected personalProject to be defined.');
}
expect(personalProject).toBeDefined();
expect(personalProject.id).toBe(ownerPersonalProject.id);
});

it('does not return non personal projects', async () => {
//
// ARRANGE
//
const owner = await createOwner();
await Container.get(ProjectRepository).delete({});
await createProject(owner);

//
// ACT
//
const personalProject = await Container.get(ProjectRepository).getPersonalProjectForUser(
owner.id,
);

//
// ASSERT
//
expect(personalProject).toBeNull();
});
});

describe('getPersonalProjectForUserOrFail', () => {
it('returns the personal project', async () => {
//
// ARRANGE
//
const owner = await createOwner();
const ownerPersonalProject = await Container.get(ProjectRepository).findOneByOrFail({
projectRelations: { userId: owner.id },
});

//
// ACT
//
const personalProject = await Container.get(
ProjectRepository,
).getPersonalProjectForUserOrFail(owner.id);

//
// ASSERT
//
if (!personalProject) {
fail('Expected personalProject to be defined.');
}
expect(personalProject).toBeDefined();
expect(personalProject.id).toBe(ownerPersonalProject.id);
});

it('does not return non personal projects', async () => {
//
// ARRANGE
//
const owner = await createOwner();
await Container.get(ProjectRepository).delete({});
await createProject(owner);

//
// ACT
//
const promise = Container.get(ProjectRepository).getPersonalProjectForUserOrFail(owner.id);

//
// ASSERT
//
await expect(promise).rejects.toThrowError(EntityNotFoundError);
});
});
});

0 comments on commit a278f59

Please sign in to comment.