Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
240 changes: 240 additions & 0 deletions src/api-v2.authz.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,19 @@ const mockServiceResource = withStatus(
}),
)

const mockCatalogResource = withStatus({
kind: 'AplCatalog',
metadata: {
name: 'test-catalog',
},
spec: {
name: 'test-catalog',
repositoryUrl: 'https://github.com/example/catalog.git',
branch: 'main',
enabled: true,
},
})

const mockWorkloadResource = withStatus(
createNamedTeamResource('AplTeamWorkload', 'my-uuid', 'team1', {
url: 'https://test.local/',
Expand Down Expand Up @@ -222,6 +235,15 @@ describe('API V2 authz tests', () => {
'getAplTeam',
'editAplTeam',
'deleteAplTeam',
// Catalogs
'getAllAplCatalogs',
'createAplCatalog',
'getAplCatalog',
'editAplCatalog',
'deleteAplCatalog',
'getAplCatalogCharts',
'getAplCatalogChart',
'refreshBYOCatalogCache',
// Services
'createAplService',
'getAplService',
Expand Down Expand Up @@ -306,6 +328,14 @@ describe('API V2 authz tests', () => {
jest.spyOn(otomiStack, 'getAllAplServices').mockReturnValue([mockServiceResource] as any)
jest.spyOn(otomiStack, 'getTeamAplServices').mockReturnValue([mockServiceResource] as any)

jest.spyOn(otomiStack, 'createAplCatalog').mockResolvedValue(mockCatalogResource as any)
jest.spyOn(otomiStack, 'getAplCatalog').mockReturnValue(mockCatalogResource as any)
jest.spyOn(otomiStack, 'editAplCatalog').mockResolvedValue(mockCatalogResource as any)
jest.spyOn(otomiStack, 'getAllAplCatalogs').mockReturnValue([mockCatalogResource] as any)
jest.spyOn(otomiStack, 'getAplCatalogCharts').mockResolvedValue([] as any)
jest.spyOn(otomiStack, 'getAplCatalogChart').mockResolvedValue({} as any)
jest.spyOn(otomiStack, 'refreshBYOCatalogCache').mockResolvedValue(undefined)

jest.spyOn(otomiStack, 'createAplWorkload').mockResolvedValue(mockWorkloadResource as any)
jest.spyOn(otomiStack, 'getAplWorkload').mockReturnValue(mockWorkloadResource as any)
jest.spyOn(otomiStack, 'editAplWorkload').mockResolvedValue(mockWorkloadResource as any)
Expand Down Expand Up @@ -1027,6 +1057,216 @@ describe('API V2 authz tests', () => {
})
})

describe('V2 Catalog Endpoints', () => {
const catalogData = {
kind: 'AplCatalog',
metadata: {
name: 'test-catalog',
},
spec: {
name: 'test-catalog',
repositoryUrl: 'https://github.com/example/catalog.git',
branch: 'main',
enabled: true,
},
}

describe('Platform Admin', () => {
test('platform admin can get all catalogs', async () => {
await agent.get('/v2/catalogs').set('Authorization', `Bearer ${platformAdminToken}`).expect(200)
})

test('platform admin can create catalog', async () => {
await agent
.post('/v2/catalogs')
.send(catalogData)
.set('Authorization', `Bearer ${platformAdminToken}`)
.expect(200)
})

test('platform admin can get specific catalog', async () => {
await agent.get('/v2/catalogs/test-catalog').set('Authorization', `Bearer ${platformAdminToken}`).expect(200)
})

test('platform admin can update catalog', async () => {
await agent
.put('/v2/catalogs/test-catalog')
.send(catalogData)
.set('Authorization', `Bearer ${platformAdminToken}`)
.expect(200)
})

test('platform admin can patch catalog', async () => {
await agent
.patch('/v2/catalogs/test-catalog')
.send(catalogData)
.set('Authorization', `Bearer ${platformAdminToken}`)
.expect(200)
})

test('platform admin can delete catalog', async () => {
await agent.delete('/v2/catalogs/test-catalog').set('Authorization', `Bearer ${platformAdminToken}`).expect(200)
})

test('platform admin can get catalog charts', async () => {
await agent
.get('/v2/catalogs/test-catalog/charts')
.set('Authorization', `Bearer ${platformAdminToken}`)
.expect(200)
})

test('platform admin can get specific catalog chart', async () => {
await agent
.get('/v2/catalogs/test-catalog/charts/test-chart')
.set('Authorization', `Bearer ${platformAdminToken}`)
.expect(200)
})

test('platform admin can refresh catalogs', async () => {
await agent.post('/v2/catalogs/refresh').set('Authorization', `Bearer ${platformAdminToken}`).expect(200)
})
})

describe('Team Admin', () => {
test('team admin can get all catalogs', async () => {
await agent.get('/v2/catalogs').set('Authorization', `Bearer ${teamAdminToken}`).expect(200)
})

test('team admin can get specific catalog', async () => {
await agent.get('/v2/catalogs/test-catalog').set('Authorization', `Bearer ${teamAdminToken}`).expect(200)
})

test('team admin can get catalog charts', async () => {
await agent.get('/v2/catalogs/test-catalog/charts').set('Authorization', `Bearer ${teamAdminToken}`).expect(200)
})

test('team admin can get specific catalog chart', async () => {
await agent
.get('/v2/catalogs/test-catalog/charts/test-chart')
.set('Authorization', `Bearer ${teamAdminToken}`)
.expect(200)
})

test('team admin cannot create catalog', async () => {
await agent.post('/v2/catalogs').send(catalogData).set('Authorization', `Bearer ${teamAdminToken}`).expect(403)
})

test('team admin cannot update catalog', async () => {
await agent
.put('/v2/catalogs/test-catalog')
.send(catalogData)
.set('Authorization', `Bearer ${teamAdminToken}`)
.expect(403)
})

test('team admin cannot patch catalog', async () => {
await agent
.patch('/v2/catalogs/test-catalog')
.send(catalogData)
.set('Authorization', `Bearer ${teamAdminToken}`)
.expect(403)
})

test('team admin cannot delete catalog', async () => {
await agent.delete('/v2/catalogs/test-catalog').set('Authorization', `Bearer ${teamAdminToken}`).expect(403)
})

test('team admin can refresh catalogs', async () => {
await agent.post('/v2/catalogs/refresh').set('Authorization', `Bearer ${teamAdminToken}`).expect(200)
})
})

describe('Team Member', () => {
test('team member can get all catalogs', async () => {
await agent.get('/v2/catalogs').set('Authorization', `Bearer ${teamMemberToken}`).expect(200)
})

test('team member can get specific catalog', async () => {
await agent.get('/v2/catalogs/test-catalog').set('Authorization', `Bearer ${teamMemberToken}`).expect(200)
})

test('team member can get catalog charts', async () => {
await agent
.get('/v2/catalogs/test-catalog/charts')
.set('Authorization', `Bearer ${teamMemberToken}`)
.expect(200)
})

test('team member can get specific catalog chart', async () => {
await agent
.get('/v2/catalogs/test-catalog/charts/test-chart')
.set('Authorization', `Bearer ${teamMemberToken}`)
.expect(200)
})

test('team member cannot create catalog', async () => {
await agent.post('/v2/catalogs').send(catalogData).set('Authorization', `Bearer ${teamMemberToken}`).expect(403)
})

test('team member cannot update catalog', async () => {
await agent
.put('/v2/catalogs/test-catalog')
.send(catalogData)
.set('Authorization', `Bearer ${teamMemberToken}`)
.expect(403)
})

test('team member cannot patch catalog', async () => {
await agent
.patch('/v2/catalogs/test-catalog')
.send(catalogData)
.set('Authorization', `Bearer ${teamMemberToken}`)
.expect(403)
})

test('team member cannot delete catalog', async () => {
await agent.delete('/v2/catalogs/test-catalog').set('Authorization', `Bearer ${teamMemberToken}`).expect(403)
})

test('team member can refresh catalogs', async () => {
await agent.post('/v2/catalogs/refresh').set('Authorization', `Bearer ${teamMemberToken}`).expect(200)
})
Comment thread
dennisvankekem marked this conversation as resolved.
})

describe('Unauthenticated', () => {
test('anonymous user cannot get all catalogs', async () => {
await agent.get('/v2/catalogs').expect(401)
})

test('anonymous user cannot create catalog', async () => {
await agent.post('/v2/catalogs').send(catalogData).expect(401)
})

test('anonymous user cannot get specific catalog', async () => {
await agent.get('/v2/catalogs/test-catalog').expect(401)
})

test('anonymous user cannot update catalog', async () => {
await agent.put('/v2/catalogs/test-catalog').send(catalogData).expect(401)
})

test('anonymous user cannot patch catalog', async () => {
await agent.patch('/v2/catalogs/test-catalog').send(catalogData).expect(401)
})

test('anonymous user cannot delete catalog', async () => {
await agent.delete('/v2/catalogs/test-catalog').expect(401)
})

test('anonymous user cannot get catalog charts', async () => {
await agent.get('/v2/catalogs/test-catalog/charts').expect(401)
})

test('anonymous user cannot get specific catalog chart', async () => {
await agent.get('/v2/catalogs/test-catalog/charts/test-chart').expect(401)
})

test('anonymous user cannot refresh catalogs', async () => {
await agent.post('/v2/catalogs/refresh').expect(401)
})
})
})

describe('V2 Build Endpoints', () => {
const buildData = createTeamResource('AplTeamBuild', {
mode: {
Expand Down
8 changes: 7 additions & 1 deletion src/openapi/api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1382,7 +1382,7 @@ paths:
operationId: refreshAplCatalogCache
x-eov-operation-handler: v2/catalogs/refresh
description: Refresh BYO catalog cache(s)
x-aclSchema: AplCatalog
x-aclSchema: AplCatalogRefresh
Comment thread
dennisvankekem marked this conversation as resolved.
parameters:
- name: catalogId
in: query
Expand Down Expand Up @@ -2455,6 +2455,12 @@ components:
required:
- kind
- spec
AplCatalogRefresh:
type: object
x-acl:
platformAdmin: [create-any]
teamAdmin: [create-any]
teamMember: [create-any]
Comment thread
dennisvankekem marked this conversation as resolved.
AplCatalogRequest:
allOf:
- $ref: '#/components/schemas/AplCatalog'
Expand Down
Loading