Skip to content

Commit 87c1efa

Browse files
committed
cr fixes
1 parent c19d04a commit 87c1efa

File tree

8 files changed

+234
-197
lines changed

8 files changed

+234
-197
lines changed

service/src/app-models/services/actions/service-lifecycle-action.spec.ts

Lines changed: 64 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -120,35 +120,31 @@ describe('ServiceLifecycleAction', () => {
120120
it('should throw 400 when no repository is linked', async () => {
121121
const elevated = useSystemIdentityContext({ injector })
122122
const ts = new Date().toISOString()
123-
await getRepository(elevated)
124-
.getDataSetFor(Stack, 'name')
125-
.add(elevated, {
126-
name: 'test-stack',
127-
displayName: 'Test',
128-
description: '',
129-
mainDirectory: '/tmp/test',
130-
createdAt: ts,
131-
updatedAt: ts,
132-
})
133-
await getRepository(elevated)
134-
.getDataSetFor(Service, 'id')
135-
.add(elevated, {
136-
id: 'no-repo-svc',
137-
stackName: 'test-stack',
138-
displayName: 'No Repo',
139-
description: '',
140-
runCommand: 'echo hi',
141-
installStatus: 'not-installed',
142-
buildStatus: 'not-built',
143-
runStatus: 'stopped',
144-
autoFetchEnabled: false,
145-
autoFetchIntervalMinutes: 60,
146-
autoRestartOnFetch: false,
147-
dependencyIds: [],
148-
prerequisiteServiceIds: [],
149-
createdAt: ts,
150-
updatedAt: ts,
151-
})
123+
await getRepository(elevated).getDataSetFor(Stack, 'name').add(elevated, {
124+
name: 'test-stack',
125+
displayName: 'Test',
126+
description: '',
127+
mainDirectory: '/tmp/test',
128+
createdAt: ts,
129+
updatedAt: ts,
130+
})
131+
await getRepository(elevated).getDataSetFor(Service, 'id').add(elevated, {
132+
id: 'no-repo-svc',
133+
stackName: 'test-stack',
134+
displayName: 'No Repo',
135+
description: '',
136+
runCommand: 'echo hi',
137+
installStatus: 'not-installed',
138+
buildStatus: 'not-built',
139+
runStatus: 'stopped',
140+
autoFetchEnabled: false,
141+
autoFetchIntervalMinutes: 60,
142+
autoRestartOnFetch: false,
143+
dependencyIds: [],
144+
prerequisiteServiceIds: [],
145+
createdAt: ts,
146+
updatedAt: ts,
147+
})
152148
await elevated[Symbol.asyncDispose]()
153149

154150
const action = ServiceLifecycleAction('pull')
@@ -160,54 +156,48 @@ describe('ServiceLifecycleAction', () => {
160156
it('should reject path traversal attempts', async () => {
161157
const elevated = useSystemIdentityContext({ injector })
162158
const ts = new Date().toISOString()
163-
await getRepository(elevated)
164-
.getDataSetFor(Stack, 'name')
165-
.add(elevated, {
166-
name: 'traversal-stack',
167-
displayName: 'Traversal',
168-
description: '',
169-
mainDirectory: '/tmp/safe',
170-
createdAt: ts,
171-
updatedAt: ts,
172-
})
173-
await getRepository(elevated)
174-
.getDataSetFor(GitHubRepository, 'id')
175-
.add(elevated, {
176-
id: 'repo-1',
177-
stackName: 'traversal-stack',
178-
url: 'https://github.com/test/repo',
179-
displayName: 'Repo',
180-
description: '',
181-
createdAt: ts,
182-
updatedAt: ts,
183-
})
184-
await getRepository(elevated)
185-
.getDataSetFor(Service, 'id')
186-
.add(elevated, {
187-
id: 'traversal-svc',
188-
stackName: 'traversal-stack',
189-
displayName: 'Traversal',
190-
description: '',
191-
workingDirectory: '../../etc',
192-
repositoryId: 'repo-1',
193-
runCommand: 'echo hi',
194-
installStatus: 'not-installed',
195-
buildStatus: 'not-built',
196-
runStatus: 'stopped',
197-
autoFetchEnabled: false,
198-
autoFetchIntervalMinutes: 60,
199-
autoRestartOnFetch: false,
200-
dependencyIds: [],
201-
prerequisiteServiceIds: [],
202-
createdAt: ts,
203-
updatedAt: ts,
204-
})
159+
await getRepository(elevated).getDataSetFor(Stack, 'name').add(elevated, {
160+
name: 'traversal-stack',
161+
displayName: 'Traversal',
162+
description: '',
163+
mainDirectory: '/tmp/safe',
164+
createdAt: ts,
165+
updatedAt: ts,
166+
})
167+
await getRepository(elevated).getDataSetFor(GitHubRepository, 'id').add(elevated, {
168+
id: 'repo-1',
169+
stackName: 'traversal-stack',
170+
url: 'https://github.com/test/repo',
171+
displayName: 'Repo',
172+
description: '',
173+
createdAt: ts,
174+
updatedAt: ts,
175+
})
176+
await getRepository(elevated).getDataSetFor(Service, 'id').add(elevated, {
177+
id: 'traversal-svc',
178+
stackName: 'traversal-stack',
179+
displayName: 'Traversal',
180+
description: '',
181+
workingDirectory: '../../etc',
182+
repositoryId: 'repo-1',
183+
runCommand: 'echo hi',
184+
installStatus: 'not-installed',
185+
buildStatus: 'not-built',
186+
runStatus: 'stopped',
187+
autoFetchEnabled: false,
188+
autoFetchIntervalMinutes: 60,
189+
autoRestartOnFetch: false,
190+
dependencyIds: [],
191+
prerequisiteServiceIds: [],
192+
createdAt: ts,
193+
updatedAt: ts,
194+
})
205195
await elevated[Symbol.asyncDispose]()
206196

207197
const action = ServiceLifecycleAction('pull')
208-
await expect(
209-
action(createMockActionContext({ injector, urlParams: { id: 'traversal-svc' } })),
210-
).rejects.toThrow('outside the stack directory')
198+
await expect(action(createMockActionContext({ injector, urlParams: { id: 'traversal-svc' } }))).rejects.toThrow(
199+
'outside the stack directory',
200+
)
211201
})
212202
})
213203
})

service/src/app-models/stacks/actions/import-export-actions.spec.ts

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -185,16 +185,20 @@ describe('Import/Export Stack Actions', () => {
185185

186186
describe('ImportStackAction', () => {
187187
it('should import a stack with services, repos and dependencies', async () => {
188+
const ts = now()
188189
const importBody = {
189190
stack: {
190191
name: 'imported-stack',
191192
displayName: 'Imported Stack',
192193
description: 'Imported',
193194
mainDirectory: '/tmp/imported',
194-
},
195+
createdAt: ts,
196+
updatedAt: ts,
197+
} satisfies Stack,
195198
services: [
196199
{
197200
id: 'imp-svc-1',
201+
stackName: 'imported-stack',
198202
displayName: 'Imported Service',
199203
description: '',
200204
workingDirectory: 'svc',
@@ -204,30 +208,39 @@ describe('Import/Export Stack Actions', () => {
204208
autoRestartOnFetch: false,
205209
dependencyIds: [],
206210
prerequisiteServiceIds: [],
207-
},
211+
installStatus: 'installed' as const,
212+
buildStatus: 'built' as const,
213+
runStatus: 'running' as const,
214+
createdAt: ts,
215+
updatedAt: ts,
216+
} satisfies Service,
208217
],
209218
repositories: [
210219
{
211220
id: 'imp-repo-1',
221+
stackName: 'imported-stack',
212222
url: 'https://github.com/test/imported',
213223
displayName: 'Imported Repo',
214224
description: '',
215-
},
225+
createdAt: ts,
226+
updatedAt: ts,
227+
} satisfies GitHubRepository,
216228
],
217229
dependencies: [
218230
{
219231
id: 'imp-dep-1',
232+
stackName: 'imported-stack',
220233
name: 'Git',
221234
checkCommand: 'git --version',
222235
installationHelp: 'Install Git',
223-
},
236+
createdAt: ts,
237+
updatedAt: ts,
238+
} satisfies Dependency,
224239
],
225240
}
226241

227242
const elevated = useSystemIdentityContext({ injector })
228-
const actionResult = await ImportStackAction(
229-
createMockActionContext({ injector: elevated, body: importBody }),
230-
)
243+
const actionResult = await ImportStackAction(createMockActionContext({ injector: elevated, body: importBody }))
231244
const body = actionResult.chunk as { success: boolean }
232245
expect(body.success).toBe(true)
233246

@@ -248,16 +261,20 @@ describe('Import/Export Stack Actions', () => {
248261
})
249262

250263
it('should reset service statuses on import', async () => {
264+
const ts = now()
251265
const importBody = {
252266
stack: {
253267
name: 'reset-test',
254268
displayName: 'Reset Test',
255269
description: '',
256270
mainDirectory: '/tmp/reset',
257-
},
271+
createdAt: ts,
272+
updatedAt: ts,
273+
} satisfies Stack,
258274
services: [
259275
{
260276
id: 'reset-svc',
277+
stackName: 'reset-test',
261278
displayName: 'Reset Service',
262279
description: '',
263280
workingDirectory: 'svc',
@@ -267,13 +284,15 @@ describe('Import/Export Stack Actions', () => {
267284
autoRestartOnFetch: false,
268285
dependencyIds: [],
269286
prerequisiteServiceIds: [],
270-
installStatus: 'installed',
271-
buildStatus: 'built',
272-
runStatus: 'running',
273-
},
287+
installStatus: 'installed' as const,
288+
buildStatus: 'built' as const,
289+
runStatus: 'running' as const,
290+
createdAt: ts,
291+
updatedAt: ts,
292+
} satisfies Service,
274293
],
275-
repositories: [],
276-
dependencies: [],
294+
repositories: [] as GitHubRepository[],
295+
dependencies: [] as Dependency[],
277296
}
278297

279298
const elevated = useSystemIdentityContext({ injector })

service/src/app-models/tokens/setup-tokens-rest-api.spec.ts

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
99
import { CreateTokenAction, DeleteTokenAction, GetTokensAction } from './setup-tokens-rest-api.js'
1010

1111
vi.mock('@furystack/core', async (importOriginal) => {
12-
const actual = (await importOriginal()) as Record<string, unknown>
12+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
13+
const actual = await importOriginal<typeof import('@furystack/core')>()
1314
return {
1415
...actual,
1516
getCurrentUser: vi.fn(),
@@ -53,9 +54,7 @@ describe('Token CRUD operations', () => {
5354
it('should create a token and return plainTextToken', async () => {
5455
mockedGetCurrentUser.mockResolvedValue({ username: 'admin', roles: ['admin'] })
5556

56-
const actionResult = await CreateTokenAction(
57-
createMockActionContext({ injector, body: { name: 'my-token' } }),
58-
)
57+
const actionResult = await CreateTokenAction(createMockActionContext({ injector, body: { name: 'my-token' } }))
5958

6059
const result = actionResult.chunk as { token: PublicApiToken; plainTextToken: string }
6160
expect(result.plainTextToken).toBeDefined()
@@ -120,23 +119,19 @@ describe('Token CRUD operations', () => {
120119
mockedGetCurrentUser.mockResolvedValue({ username: 'admin', roles: ['admin'] })
121120

122121
const elevated = useSystemIdentityContext({ injector })
123-
await getRepository(elevated)
124-
.getDataSetFor(ApiToken, 'id')
125-
.add(elevated, {
126-
id: 'tok-del',
127-
username: 'admin',
128-
name: 'Delete Me',
129-
tokenHash: 'hash',
130-
createdAt: new Date().toISOString(),
131-
})
132-
await getRepository(elevated)
133-
.getDataSetFor(PublicApiToken, 'id')
134-
.add(elevated, {
135-
id: 'tok-del',
136-
username: 'admin',
137-
name: 'Delete Me',
138-
createdAt: new Date().toISOString(),
139-
})
122+
await getRepository(elevated).getDataSetFor(ApiToken, 'id').add(elevated, {
123+
id: 'tok-del',
124+
username: 'admin',
125+
name: 'Delete Me',
126+
tokenHash: 'hash',
127+
createdAt: new Date().toISOString(),
128+
})
129+
await getRepository(elevated).getDataSetFor(PublicApiToken, 'id').add(elevated, {
130+
id: 'tok-del',
131+
username: 'admin',
132+
name: 'Delete Me',
133+
createdAt: new Date().toISOString(),
134+
})
140135
await elevated[Symbol.asyncDispose]()
141136

142137
await DeleteTokenAction(createMockActionContext({ injector, urlParams: { id: 'tok-del' } }))
@@ -151,15 +146,13 @@ describe('Token CRUD operations', () => {
151146
mockedGetCurrentUser.mockResolvedValue({ username: 'admin', roles: ['admin'] })
152147

153148
const elevated = useSystemIdentityContext({ injector })
154-
await getRepository(elevated)
155-
.getDataSetFor(ApiToken, 'id')
156-
.add(elevated, {
157-
id: 'tok-other',
158-
username: 'other-user',
159-
name: 'Other Token',
160-
tokenHash: 'hash',
161-
createdAt: new Date().toISOString(),
162-
})
149+
await getRepository(elevated).getDataSetFor(ApiToken, 'id').add(elevated, {
150+
id: 'tok-other',
151+
username: 'other-user',
152+
name: 'Other Token',
153+
tokenHash: 'hash',
154+
createdAt: new Date().toISOString(),
155+
})
163156
await elevated[Symbol.asyncDispose]()
164157

165158
await expect(

service/src/app-models/tokens/setup-tokens-rest-api.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,10 @@ export const GetTokensAction: RequestAction<TokensApi['GET']['/tokens']> = async
6464
return JsonResult({ count: publicTokens.length, entries: publicTokens })
6565
}
6666

67-
export const DeleteTokenAction: RequestAction<TokensApi['DELETE']['/tokens/:id']> = async ({ injector, getUrlParams }) => {
67+
export const DeleteTokenAction: RequestAction<TokensApi['DELETE']['/tokens/:id']> = async ({
68+
injector,
69+
getUrlParams,
70+
}) => {
6871
const currentUser = await getCurrentUser(injector)
6972

7073
if (!currentUser) {

0 commit comments

Comments
 (0)