| 1 | import path from 'node:path'; |
| 2 | import { createDatabase, type |
| 3 | import { inArray } |
| 4 | import { migrate } |
| 5 | import { afterAll, beforeAll |
| 6 | |
| 7 | import { RepositoryAccessService } |
| 8 | import { SuggestionsService } |
| 9 | |
| 10 | const CONNECTION = process |
| 11 | const MIGRATIONS = path |
| 12 | import.meta.dirname, |
| 13 | '../../../../../packages/db/drizzle', |
| 14 | ); |
| 15 | |
| 16 | const USERS = { |
| 17 | owner: 'user_suggest_owner', |
| 18 | collaborator: 'user_suggest_collaborator', |
| 19 | commenter: 'user_suggest_commenter', |
| 20 | stranger: 'user_suggest_stranger', |
| 21 | }; |
| 22 | |
| 23 | // Needs a throwaway Postgres; the suite is skipped without one. |
| 24 | describe.skipIf(!CONNECTION |
| 25 | let db: |
| 26 | let pool: |
| 27 | let suggestions: |
| 28 | const target = |
| 29 | |
| 30 | beforeAll(async () |
| 31 | ({ db, pool |
| 32 | await migrate(db |
| 33 | suggestions = new |
| 34 | |
| 35 | await db |
| 36 | .delete(schema.user |
| 37 | .where(inArray(schema |
| 38 | await db.insert |
| 39 | Object.entries(USERS |
| 40 | id, |
| 41 | name: role, |
| 42 | email: `suggest-${role |
| 43 | username: `suggest-${role |
| 44 | })), |
| 45 | ); |
| 46 | const [repository] |
| 47 | .insert(schema.repository |
| 48 | .values({ |
| 49 | name: 'app', |
| 50 | slug: 'app', |
| 51 | ownerId: USERS.owner |
| 52 | visibility: 'public', |
| 53 | }) |
| 54 | .returning(); |
| 55 | await db.insert |
| 56 | repositoryId: repository.id |
| 57 | userId: USERS.collaborator |
| 58 | role: 'write', |
| 59 | acceptedAt: new Date |
| 60 | }); |
| 61 | const [first] |
| 62 | .insert(schema.issue |
| 63 | .values([ |
| 64 | { |
| 65 | repositoryId: repository.id |
| 66 | number: 1, |
| 67 | title: 'Login fails', |
| 68 | authorId: USERS.owner |
| 69 | }, |
| 70 | { |
| 71 | repositoryId: repository.id |
| 72 | number: 12, |
| 73 | title: 'Add dark mode', |
| 74 | authorId: USERS.owner |
| 75 | isPullRequest: true, |
| 76 | }, |
| 77 | { |
| 78 | repositoryId: repository.id |
| 79 | number: 2, |
| 80 | title: 'Crash on login', |
| 81 | authorId: USERS.owner |
| 82 | state: 'closed', |
| 83 | }, |
| 84 | ]) |
| 85 | .returning(); |
| 86 | await db.insert |
| 87 | issueId: first.id |
| 88 | authorId: USERS.commenter |
| 89 | body: 'Same here', |
| 90 | }); |
| 91 | }); |
| 92 | |
| 93 | afterAll(async () |
| 94 | await db |
| 95 | .delete(schema.user |
| 96 | .where(inArray(schema |
| 97 | await pool?.end |
| 98 | }); |
| 99 | |
| 100 | it('suggests the people involved in the repository when nothing is typed', |
| 101 | const { users |
| 102 | expect(users.map |
| 103 | 'suggest-collaborator', |
| 104 | 'suggest-commenter', |
| 105 | 'suggest-owner', |
| 106 | ]); |
| 107 | }); |
| 108 | |
| 109 | it('matches anyone by username prefix, the involved first', |
| 110 | const { users |
| 111 | expect(users.map |
| 112 | 'suggest-collaborator', |
| 113 | 'suggest-commenter', |
| 114 | 'suggest-owner', |
| 115 | 'suggest-stranger', |
| 116 | ]); |
| 117 | expect( |
| 118 | (await suggestions.users |
| 119 | ).toEqual([ |
| 120 | { username: 'suggest-stranger', |
| 121 | ]); |
| 122 | expect((await suggestions |
| 123 | }); |
| 124 | |
| 125 | it('suggests issues and pull requests by number prefix or title, newest first', |
| 126 | const numbers = |
| 127 | (await suggestions.issues |
| 128 | (issue) => |
| 129 | ); |
| 130 | |
| 131 | expect(await numbers |
| 132 | expect(await numbers |
| 133 | expect(await numbers |
| 134 | expect((await suggestions |
| 135 | { |
| 136 | number: 12, |
| 137 | title: 'Add dark mode', |
| 138 | state: 'open', |
| 139 | isPullRequest: true, |
| 140 | }, |
| 141 | ]); |
| 142 | }); |
| 143 | }); |