@furystack/rest-service
Version:
Repository implementation for FuryStack
84 lines (78 loc) • 2.98 kB
text/typescript
import { usingAsync } from '@furystack/utils'
import { Injector } from '@furystack/inject'
import type { GetEntityEndpoint } from '@furystack/rest'
import { serializeToQueryString } from '@furystack/rest'
import { MockClass, setupContext } from './utils.js'
import { createGetEntityEndpoint } from './create-get-entity-endpoint.js'
import { getDataSetFor } from '@furystack/repository'
import { useRestService } from '../helpers.js'
import { describe, it, expect } from 'vitest'
import { getPort } from '@furystack/core/port-generator'
describe('createGetEntityEndpoint', () => {
it('Should return the entity', async () => {
await usingAsync(new Injector(), async (i) => {
setupContext(i)
const port = getPort()
await useRestService<{ GET: { '/:id': GetEntityEndpoint<MockClass, 'id'> } }>({
injector: i,
root: '/api',
port,
api: {
GET: {
'/:id': createGetEntityEndpoint({ model: MockClass, primaryKey: 'id' }),
},
},
})
const mockEntity: MockClass = { id: 'mock', value: 'mock' }
await getDataSetFor(i, MockClass, 'id').add(i, mockEntity)
const response = await fetch(`http://127.0.0.1:${port}/api/mock`, { method: 'GET' })
expect(response.status).toBe(200)
const body = await response.json()
expect(body).toEqual(mockEntity)
})
})
it('Should return the entity with the selected fields', async () => {
await usingAsync(new Injector(), async (i) => {
setupContext(i)
const port = getPort()
await useRestService<{ GET: { '/:id': GetEntityEndpoint<MockClass, 'id'> } }>({
injector: i,
root: '/api',
port,
api: {
GET: {
'/:id': createGetEntityEndpoint({ model: MockClass, primaryKey: 'id' }),
},
},
})
const mockEntity: MockClass = { id: 'mock', value: 'mock' }
await getDataSetFor(i, MockClass, 'id').add(i, mockEntity)
const response = await fetch(`http://127.0.0.1:${port}/api/mock?${serializeToQueryString({ select: ['id'] })}`, {
method: 'GET',
})
expect(response.status).toBe(200)
const body = await response.json()
expect(body).toEqual({ id: mockEntity.id })
})
})
it('Should return 404 if no entity has been found', async () => {
await usingAsync(new Injector(), async (i) => {
setupContext(i)
const port = getPort()
await useRestService<{ GET: { '/:id': GetEntityEndpoint<MockClass, 'id'> } }>({
injector: i,
root: '/api',
port,
api: {
GET: {
'/:id': createGetEntityEndpoint({ model: MockClass, primaryKey: 'id' }),
},
},
})
const result = await fetch(`http://127.0.0.1:${port}/api/mock`, { method: 'GET' })
expect(result.status).toBe(404)
const body = await result.json()
expect(body).toEqual({ message: 'Entity not found' })
})
})
})