Compile PDF and EPUB files from static Web assets.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 

158 Zeilen
3.8 KiB

  1. import { FastifyInstance } from 'fastify';
  2. import {
  3. describe,
  4. it,
  5. expect,
  6. beforeAll,
  7. afterAll,
  8. vi,
  9. } from 'vitest';
  10. import { constants } from 'http2';
  11. import { createServer } from '../src/server';
  12. import { addRoutes } from '../src/routes';
  13. import {
  14. AdderServiceImpl,
  15. ArgumentOutOfRangeError,
  16. InvalidArgumentTypeError,
  17. } from '../src/modules/adder';
  18. describe('add', () => {
  19. let server: FastifyInstance;
  20. const body = { a: 1, b: 2 };
  21. beforeAll(() => {
  22. server = createServer();
  23. addRoutes(server);
  24. });
  25. afterAll(async () => {
  26. await server.close();
  27. });
  28. it('returns result when successful', async () => {
  29. const response = await server
  30. .inject()
  31. .post('/add')
  32. .body(body)
  33. .headers({
  34. 'Accept': 'application/json',
  35. });
  36. expect(response.statusCode).toBe(constants.HTTP_STATUS_OK);
  37. });
  38. it('returns error when given invalid inputs', async () => {
  39. vi.spyOn(AdderServiceImpl.prototype, 'addNumbers').mockImplementationOnce(() => {
  40. throw new InvalidArgumentTypeError('Invalid input');
  41. });
  42. const response = await server
  43. .inject()
  44. .post('/add')
  45. .body(body)
  46. .headers({
  47. 'Accept': 'application/json',
  48. });
  49. expect(response.statusCode).toBe(constants.HTTP_STATUS_BAD_REQUEST);
  50. });
  51. it('returns error when given out-of-range inputs', async () => {
  52. vi.spyOn(AdderServiceImpl.prototype, 'addNumbers').mockImplementationOnce(() => {
  53. throw new ArgumentOutOfRangeError('Out of range');
  54. });
  55. const response = await server
  56. .inject()
  57. .post('/add')
  58. .body(body)
  59. .headers({
  60. 'Accept': 'application/json',
  61. });
  62. expect(response.statusCode).toBe(constants.HTTP_STATUS_BAD_REQUEST);
  63. });
  64. it('returns error when an unexpected error occurs', async () => {
  65. vi.spyOn(AdderServiceImpl.prototype, 'addNumbers').mockImplementationOnce(() => {
  66. throw new Error('Unexpected error');
  67. });
  68. const response = await server
  69. .inject()
  70. .post('/add')
  71. .body({ a: 1, b: 2 })
  72. .headers({
  73. 'Accept': 'application/json',
  74. });
  75. expect(response.statusCode).toBe(constants.HTTP_STATUS_INTERNAL_SERVER_ERROR);
  76. });
  77. });
  78. describe('subtract', () => {
  79. let server: FastifyInstance;
  80. const body = { a: 1, b: 2 };
  81. beforeAll(() => {
  82. server = createServer();
  83. addRoutes(server);
  84. });
  85. afterAll(async () => {
  86. await server.close();
  87. });
  88. it('returns result when successful', async () => {
  89. const response = await server
  90. .inject()
  91. .post('/subtract')
  92. .body(body)
  93. .headers({
  94. 'Accept': 'application/json',
  95. });
  96. expect(response.statusCode).toBe(constants.HTTP_STATUS_OK);
  97. });
  98. it('returns error when given invalid inputs', async () => {
  99. vi.spyOn(AdderServiceImpl.prototype, 'addNumbers').mockImplementationOnce(() => {
  100. throw new InvalidArgumentTypeError('Invalid input');
  101. });
  102. const response = await server
  103. .inject()
  104. .post('/subtract')
  105. .body(body)
  106. .headers({
  107. 'Accept': 'application/json',
  108. });
  109. expect(response.statusCode).toBe(constants.HTTP_STATUS_BAD_REQUEST);
  110. });
  111. it('returns error when given out-of-range inputs', async () => {
  112. vi.spyOn(AdderServiceImpl.prototype, 'addNumbers').mockImplementationOnce(() => {
  113. throw new ArgumentOutOfRangeError('Out of range');
  114. });
  115. const response = await server
  116. .inject()
  117. .post('/subtract')
  118. .body(body)
  119. .headers({
  120. 'Accept': 'application/json',
  121. });
  122. expect(response.statusCode).toBe(constants.HTTP_STATUS_BAD_REQUEST);
  123. });
  124. it('returns error when an unexpected error occurs', async () => {
  125. vi.spyOn(AdderServiceImpl.prototype, 'addNumbers').mockImplementationOnce(() => {
  126. throw new Error('Unexpected error');
  127. });
  128. const response = await server
  129. .inject()
  130. .post('/subtract')
  131. .body({ a: 1, b: 2 })
  132. .headers({
  133. 'Accept': 'application/json',
  134. });
  135. expect(response.statusCode).toBe(constants.HTTP_STATUS_INTERNAL_SERVER_ERROR);
  136. });
  137. });