@websolutespa/payload-plugin-bowl
Version:
Bowl PayloadCms plugin of the BOM Repository
214 lines (213 loc) • 9.49 kB
JavaScript
import { config, getTestConfig, PageCollection } from '@/test';
import { clearContext, endUsers, getContext, users } from '@websolutespa/test/payload';
import { v4 as uuid } from 'uuid';
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
import { options } from '../../options';
const BASE_URL = 'https://www.example.com';
describe('route.service', ()=>{
let payload;
let client;
let userToken;
let endUserToken;
let apiKey;
let testConfig;
let query;
beforeAll(async ()=>{
const context = await getContext(config);
payload = context.payload;
client = context.client;
userToken = await client.getToken('users', users.admin);
endUserToken = await client.getToken('end_users', endUsers.user);
apiKey = users.api.apiKey;
testConfig = await getTestConfig(client, userToken);
query = `?market=${testConfig.documents.market.id}&locale=${options.defaultLocale}`;
});
afterAll(async ()=>{
await clearContext();
});
describe('Payload config', ()=>{
it('should have a endpoint with "/route" path and method "get', ()=>{
expect(payload.config.endpoints.find((endpoint)=>endpoint.path === '/route' && endpoint.method === 'get')).toBeDefined();
});
it('should have a endpoint with "/route" path and method "post', ()=>{
expect(payload.config.endpoints.find((endpoint)=>endpoint.path === '/route' && endpoint.method === 'post')).toBeDefined();
});
});
describe('endpoint test requests', ()=>{
let pageDoc;
beforeAll(async ()=>{
const { doc } = await client.post(PageCollection.slug, {
title: uuid(),
category: testConfig.documents.category.id,
market: [
testConfig.documents.market.id
],
useSplat: true,
_status: 'published'
}, {
headers: {
Authorization: `JWT ${userToken}`
}
});
pageDoc = await client.get(`/${PageCollection.slug}/${doc.id}${query}`, {
headers: {
Authorization: `users API-Key ${users.api.apiKey}`
}
});
});
describe('/route post', ()=>{
it('should return a valid route for an exact route match', async ()=>{
console.log(pageDoc.href);
const response = await client.post('route', {
pathname: pageDoc.href,
href: `${BASE_URL}${pageDoc.href}`
}, {
headers: {
Authorization: `users API-Key ${users.api.apiKey}`
}
});
expect(response).toBeDefined();
expect(response.id).toEqual(pageDoc.href);
expect(response.splat).toBeUndefined();
});
it('should return a valid route for a route match with splat', async ()=>{
const splatSegment = '/' + uuid();
const response = await client.post('route', {
pathname: pageDoc.href + splatSegment,
href: `${BASE_URL}${pageDoc.href}${splatSegment}`
}, {
headers: {
Authorization: `users API-Key ${users.api.apiKey}`
}
});
expect(response).toBeDefined();
expect(response.id).toEqual(pageDoc.href);
expect(response.splat).toEqual(splatSegment);
});
it('should return 404 for a non existing route (without matching redirect)', async ()=>{
const pathname = '/' + uuid();
try {
const response = await client.post('route', {
pathname: pathname,
href: `${BASE_URL}${pathname}`
}, {
headers: {
Authorization: `users API-Key ${users.api.apiKey}`
}
});
expect(response).toBeUndefined();
} catch (error) {
expect(error).toBeDefined();
expect(error.status).toEqual(404);
}
});
describe('redirects', ()=>{
it('should return a valid redirect response for an exact redirect route match', async ()=>{
const redirectStatus = 301;
const redirectFrom = '/from';
await client.post(options.slug.redirect, {
status: redirectStatus,
from: `${BASE_URL}${redirectFrom}`,
to: '/to',
isActive: true
}, {
headers: {
Authorization: `JWT ${userToken}`
}
});
try {
const response = await client.post('route', {
pathname: redirectFrom,
href: `${BASE_URL}${redirectFrom}`
}, {
headers: {
Authorization: `users API-Key ${users.api.apiKey}`
}
});
expect(response).toBeUndefined();
} catch (error) {
expect(error).toBeDefined();
expect(error.status).toEqual(redirectStatus);
}
});
it('should return a valid redirect response for a redirect route match with wildcard', async ()=>{
const redirectStatus = 301;
await client.post(options.slug.redirect, {
status: redirectStatus,
from: `${BASE_URL}/from/*`,
to: '/to',
isActive: true
}, {
headers: {
Authorization: `JWT ${userToken}`
}
});
try {
const response = await client.post('route', {
pathname: '/from/xyz',
href: `${BASE_URL}/from/xyz`
}, {
headers: {
Authorization: `users API-Key ${users.api.apiKey}`
}
});
expect(response).toBeUndefined();
} catch (error) {
expect(error).toBeDefined();
expect(error.status).toEqual(redirectStatus);
}
});
});
});
describe('/route get', ()=>{
describe('One market', ()=>{
it('should return one route for each locale', async ()=>{
const routes = await client.get(`/route?t=${uuid()}`, {
headers: {
Authorization: `JWT ${userToken}`
}
});
options.locales.forEach((locale)=>{
const code = typeof locale === 'string' ? locale : locale.code;
expect(routes.find((route)=>route.locale === code)).toBeDefined();
});
});
it('should allow filtering via query params', async ()=>{
const routes = await client.get(`/route?t=${uuid()}&where[id][equals]=${pageDoc.href}`, {
headers: {
Authorization: `JWT ${userToken}`
}
});
expect(routes.length).toEqual(1);
});
});
describe('Multiple markets', ()=>{
let marketDoc;
beforeAll(async ()=>{
({ doc: marketDoc } = await client.post(options.slug.market, {
id: uuid(),
title: uuid(),
isActive: true
}, {
headers: {
Authorization: `JWT ${userToken}`
}
}));
});
it('should return one route for each market and locale', async ()=>{
const routes = await client.get(`route?t=${uuid()}&market=${marketDoc.id}`, {
headers: {
Authorization: `JWT ${userToken}`
}
});
options.locales.forEach((locale)=>{
const code = typeof locale === 'string' ? locale : locale.code;
expect(routes.find((route)=>route.locale === code && route.market === testConfig.documents.market.id)).toBeDefined();
expect(routes.find((route)=>route.locale === code && route.market === marketDoc.id)).toBeDefined();
});
});
});
});
});
});
//# sourceMappingURL=route.service.test.js.map