default-scheduler-plugin.e2e-spec.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { DefaultSchedulerPlugin, mergeConfig, ScheduledTask } from '@vendure/core';
  2. import { createTestEnvironment } from '@vendure/testing';
  3. import gql from 'graphql-tag';
  4. import path from 'path';
  5. import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest';
  6. import { initialData } from '../../../e2e-common/e2e-initial-data';
  7. import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
  8. import {
  9. GetTasksQuery,
  10. RunTaskMutation,
  11. RunTaskMutationVariables,
  12. UpdateTaskMutation,
  13. UpdateTaskMutationVariables,
  14. } from './graphql/generated-e2e-admin-types';
  15. import { awaitRunningJobs } from './utils/await-running-jobs';
  16. describe('Default scheduler plugin', () => {
  17. const taskSpy = vi.fn();
  18. const { server, adminClient } = createTestEnvironment(
  19. mergeConfig(testConfig(), {
  20. schedulerOptions: {
  21. tasks: [
  22. new ScheduledTask({
  23. id: 'test-job',
  24. description: "A test job that doesn't do anything",
  25. schedule: cron => cron.everySaturdayAt(0, 0),
  26. async execute(injector) {
  27. taskSpy();
  28. return { success: true };
  29. },
  30. }),
  31. ],
  32. runTasksInWorkerOnly: false,
  33. },
  34. plugins: [DefaultSchedulerPlugin.init({ manualTriggerCheckInterval: 50 })],
  35. }),
  36. );
  37. beforeAll(async () => {
  38. await server.init({
  39. initialData,
  40. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-full.csv'),
  41. customerCount: 1,
  42. });
  43. await adminClient.asSuperAdmin();
  44. // We have extra time here because a lot of jobs are
  45. // triggered from all the product updates
  46. await awaitRunningJobs(adminClient, 10_000, 1000);
  47. }, TEST_SETUP_TIMEOUT_MS);
  48. afterAll(async () => {
  49. await awaitRunningJobs(adminClient);
  50. await server.destroy();
  51. });
  52. it('get tasks', async () => {
  53. const { scheduledTasks } = await adminClient.query<GetTasksQuery>(GET_TASKS);
  54. expect(scheduledTasks.length).toBe(1);
  55. expect(scheduledTasks[0].id).toBe('test-job');
  56. expect(scheduledTasks[0].description).toBe("A test job that doesn't do anything");
  57. expect(scheduledTasks[0].schedule).toBe('0 0 * * 6');
  58. expect(scheduledTasks[0].scheduleDescription).toBe('At 12:00 AM, only on Saturday');
  59. expect(scheduledTasks[0].enabled).toBe(true);
  60. });
  61. it('disable task', async () => {
  62. const { updateScheduledTask } = await adminClient.query<
  63. UpdateTaskMutation,
  64. UpdateTaskMutationVariables
  65. >(UPDATE_TASK, {
  66. input: {
  67. id: 'test-job',
  68. enabled: false,
  69. },
  70. });
  71. expect(updateScheduledTask.enabled).toBe(false);
  72. });
  73. it('enable task', async () => {
  74. const { updateScheduledTask } = await adminClient.query<
  75. UpdateTaskMutation,
  76. UpdateTaskMutationVariables
  77. >(UPDATE_TASK, {
  78. input: {
  79. id: 'test-job',
  80. enabled: true,
  81. },
  82. });
  83. expect(updateScheduledTask.enabled).toBe(true);
  84. });
  85. it('run task', async () => {
  86. taskSpy.mockClear();
  87. expect(taskSpy).toHaveBeenCalledTimes(0);
  88. const { runScheduledTask } = await adminClient.query<RunTaskMutation, RunTaskMutationVariables>(
  89. RUN_TASK,
  90. { id: 'test-job' },
  91. );
  92. expect(runScheduledTask.success).toBe(true);
  93. await new Promise(resolve => setTimeout(resolve, 100));
  94. expect(taskSpy).toHaveBeenCalledTimes(1);
  95. });
  96. });
  97. export const GET_TASKS = gql`
  98. query GetTasks {
  99. scheduledTasks {
  100. id
  101. description
  102. schedule
  103. scheduleDescription
  104. lastResult
  105. enabled
  106. }
  107. }
  108. `;
  109. export const UPDATE_TASK = gql`
  110. mutation UpdateTask($input: UpdateScheduledTaskInput!) {
  111. updateScheduledTask(input: $input) {
  112. id
  113. enabled
  114. }
  115. }
  116. `;
  117. export const RUN_TASK = gql`
  118. mutation RunTask($id: String!) {
  119. runScheduledTask(id: $id) {
  120. success
  121. }
  122. }
  123. `;