HATEOAS-first backend framework.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

101 рядки
2.3 KiB

  1. import {describe, afterAll, beforeAll, it} from 'vitest';
  2. import {Application, application, resource, Resource, validation as v} from '../../src/common';
  3. import {Backend, DataSource, RequestContext} from '../../src/backend';
  4. import {createTestClient, DummyDataSource, dummyGenerationStrategy, TEST_LANGUAGE, TestClient} from '../utils';
  5. const PORT = 3001;
  6. const HOST = '127.0.0.1';
  7. const BASE_PATH = '/api';
  8. const ACCEPT = 'application/json';
  9. const ACCEPT_LANGUAGE = 'en';
  10. const ACCEPT_CHARSET = 'utf-8';
  11. const CONTENT_TYPE_CHARSET = 'utf-8';
  12. const CONTENT_TYPE = ACCEPT;
  13. describe('decorators', () => {
  14. let Piano: Resource;
  15. let app: Application;
  16. let dataSource: DataSource;
  17. let backend: Backend;
  18. let server: ReturnType<Backend['createHttpServer']>;
  19. let client: TestClient;
  20. beforeAll(() => {
  21. Piano = resource(v.object(
  22. {
  23. brand: v.string()
  24. },
  25. v.never()
  26. ))
  27. .name('Piano' as const)
  28. .route('pianos' as const)
  29. .id('id' as const, {
  30. generationStrategy: dummyGenerationStrategy,
  31. serialize: (id) => id?.toString() ?? '0',
  32. deserialize: (id) => Number.isFinite(Number(id)) ? Number(id) : 0,
  33. schema: v.number(),
  34. });
  35. app = application({
  36. name: 'piano-service',
  37. })
  38. .language(TEST_LANGUAGE)
  39. .resource(Piano);
  40. dataSource = new DummyDataSource();
  41. backend = app.createBackend({
  42. dataSource,
  43. });
  44. server = backend.createHttpServer({
  45. basePath: BASE_PATH
  46. });
  47. client = createTestClient({
  48. host: HOST,
  49. port: PORT,
  50. })
  51. .acceptMediaType(ACCEPT)
  52. .acceptLanguage(ACCEPT_LANGUAGE)
  53. .acceptCharset(ACCEPT_CHARSET)
  54. .contentType(CONTENT_TYPE)
  55. .contentCharset(CONTENT_TYPE_CHARSET);
  56. return new Promise((resolve, reject) => {
  57. server.on('error', (err) => {
  58. reject(err);
  59. });
  60. server.on('listening', () => {
  61. resolve();
  62. });
  63. // TODO add .inject() method
  64. server.listen({
  65. port: PORT
  66. });
  67. });
  68. });
  69. afterAll(() => new Promise<void>((resolve, reject) => {
  70. server.close((err) => {
  71. if (err) {
  72. reject(err);
  73. }
  74. resolve();
  75. });
  76. }));
  77. it('decorates requests', () => {
  78. server.requestDecorator((req) => {
  79. const reqMut = req as unknown as Record<string, unknown>;
  80. reqMut['foo'] = 'bar';
  81. return reqMut as unknown as RequestContext;
  82. });
  83. // TODO how to make assertions here
  84. });
  85. });