Files
nimbus/resources/js/tests/components/RequestHeaders.test.ts
Mazen Touati 6ba071dc98 test: front-end tests cleanup (round 1)
the aim is to make the tests more about the behavior rather than implementation, add some missing tests, and improve the code.
2025-11-16 19:03:40 +01:00

190 lines
5.7 KiB
TypeScript

import RequestHeaders from '@/components/domain/Client/Request/RequestHeader/RequestHeaders.vue';
import { AuthorizationType } from '@/interfaces/generated';
import { GeneratorType, PendingRequest, RequestBodyTypeEnum } from '@/interfaces/http';
import { renderWithProviders } from '@/tests/_utils/test-utils';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { nextTick, reactive, ref } from 'vue';
const mockConfigStore = reactive({
headers: [
{ header: 'X-Global', type: 'raw', value: 'foo' },
{ header: 'X-Generated', type: 'generator', value: GeneratorType.Email },
],
});
const generateValue = vi.fn(() => 'generated@example.com');
const mockRequestStore = reactive({
pendingRequestData: ref<PendingRequest | null>(null),
updateRequestHeaders: vi.fn(),
});
vi.mock('@/stores', async importOriginal => {
const actual = await importOriginal<object>();
return {
...actual,
useRequestStore: () => mockRequestStore,
useConfigStore: () => mockConfigStore,
useValueGeneratorStore: () => ({
generateValue,
}),
};
});
const renderComponent = () => renderWithProviders(RequestHeaders);
const setPendingRequest = (request: PendingRequest | null) => {
mockRequestStore.pendingRequestData = ref(request);
};
describe('RequestHeaders', () => {
beforeEach(() => {
generateValue.mockClear();
mockConfigStore.headers = [
{ header: 'X-Global', type: 'raw', value: 'foo' },
{ header: 'X-Generated', type: 'generator', value: GeneratorType.Email },
];
setPendingRequest({
method: 'GET',
endpoint: 'api/users',
headers: [],
body: {},
payloadType: RequestBodyTypeEnum.EMPTY,
schema: {
shape: {
'x-name': 'root',
'x-required': false,
},
extractionErrors: null,
},
queryParameters: [],
authorization: { type: AuthorizationType.None },
supportedRoutes: [],
routeDefinition: {
method: 'GET',
endpoint: 'api/users',
schema: {
shape: {
'x-name': 'root',
'x-required': false,
},
extractionErrors: null,
},
shortEndpoint: 'api/users',
},
isProcessing: false,
wasExecuted: false,
durationInMs: 0,
});
mockRequestStore.updateRequestHeaders.mockClear();
});
it('initializes headers with global defaults and syncs them to the store', async () => {
renderComponent();
await nextTick();
expect(mockRequestStore.updateRequestHeaders).toHaveBeenCalledWith(
expect.arrayContaining([
expect.objectContaining({ key: 'X-Global', value: 'foo' }),
expect.objectContaining({
key: 'X-Generated',
value: 'generated@example.com',
}),
]),
);
expect(generateValue).toHaveBeenCalledWith('email');
});
it('reinitializes headers when the request method changes', async () => {
renderComponent();
await nextTick();
mockRequestStore.updateRequestHeaders.mockClear();
setPendingRequest({
...mockRequestStore.pendingRequestData!,
method: 'PUT', // <- Different method that the original one.
headers: [],
});
await nextTick();
expect(mockRequestStore.updateRequestHeaders).toHaveBeenCalledWith(
expect.arrayContaining([
expect.objectContaining({ key: 'X-Global', value: 'foo' }),
]),
);
});
it('reinitializes headers when the request endpoint changes', async () => {
renderComponent();
await nextTick();
mockRequestStore.updateRequestHeaders.mockClear();
setPendingRequest({
...mockRequestStore.pendingRequestData!,
endpoint: 'api/accounts',
headers: [],
});
await nextTick();
expect(mockRequestStore.updateRequestHeaders).toHaveBeenCalledWith(
expect.arrayContaining([
expect.objectContaining({ key: 'X-Global', value: 'foo' }),
]),
);
});
it('does not reinitialize when method and endpoint stay the same', async () => {
renderComponent();
await nextTick();
mockRequestStore.updateRequestHeaders.mockClear();
setPendingRequest({
...mockRequestStore.pendingRequestData!,
headers: [],
});
await nextTick();
expect(mockRequestStore.updateRequestHeaders).not.toHaveBeenCalled();
});
it('merges existing request headers with global ones when changing endpoints', async () => {
mockRequestStore.pendingRequestData.headers = [
{ key: 'X-Existing', value: '123' },
{ key: 'X-Global', value: 'custom' },
];
renderComponent();
mockRequestStore.updateRequestHeaders.mockClear();
setPendingRequest({
...mockRequestStore.pendingRequestData!,
method: 'PUT', // <- Different method that the original one to re-trigger th.
headers: [],
});
await nextTick();
expect(mockRequestStore.updateRequestHeaders).toHaveBeenCalledWith(
expect.arrayContaining([
expect.objectContaining({ key: 'X-Existing', value: '123' }),
expect.objectContaining({ key: 'X-Global', value: 'custom' }),
]),
);
});
});