mirror of
https://github.com/strapi/strapi.git
synced 2025-07-04 15:42:03 +00:00
213 lines
4.5 KiB
JavaScript
213 lines
4.5 KiB
JavaScript
![]() |
'use strict';
|
||
|
|
||
|
// Helpers.
|
||
|
const { createTestBuilder } = require('api-tests/builder');
|
||
|
const { createStrapiInstance } = require('api-tests/strapi');
|
||
|
const { createAuthRequest } = require('api-tests/request');
|
||
|
|
||
|
const builder = createTestBuilder();
|
||
|
let strapi;
|
||
|
let rq;
|
||
|
let graphqlQuery;
|
||
|
|
||
|
const rgbColorComponent = {
|
||
|
attributes: {
|
||
|
name: {
|
||
|
type: 'text',
|
||
|
},
|
||
|
red: {
|
||
|
type: 'integer',
|
||
|
},
|
||
|
green: {
|
||
|
type: 'integer',
|
||
|
},
|
||
|
blue: {
|
||
|
type: 'integer',
|
||
|
},
|
||
|
},
|
||
|
displayName: 'rgbColor',
|
||
|
};
|
||
|
|
||
|
const labelModel = {
|
||
|
attributes: {
|
||
|
name: {
|
||
|
type: 'richtext',
|
||
|
},
|
||
|
color: {
|
||
|
type: 'component',
|
||
|
component: 'default.rgb-color',
|
||
|
repeatable: false,
|
||
|
},
|
||
|
colors: {
|
||
|
type: 'component',
|
||
|
component: 'default.rgb-color',
|
||
|
repeatable: true,
|
||
|
},
|
||
|
},
|
||
|
singularName: 'label',
|
||
|
pluralName: 'labels',
|
||
|
displayName: 'Label',
|
||
|
description: '',
|
||
|
collectionName: '',
|
||
|
};
|
||
|
|
||
|
describe('Test Graphql Components API End to End', () => {
|
||
|
beforeAll(async () => {
|
||
|
await builder.addComponent(rgbColorComponent).addContentTypes([labelModel]).build();
|
||
|
|
||
|
strapi = await createStrapiInstance();
|
||
|
rq = await createAuthRequest({ strapi });
|
||
|
|
||
|
graphqlQuery = (body) => {
|
||
|
return rq({
|
||
|
url: '/graphql',
|
||
|
method: 'POST',
|
||
|
body,
|
||
|
});
|
||
|
};
|
||
|
});
|
||
|
|
||
|
afterAll(async () => {
|
||
|
await strapi.destroy();
|
||
|
await builder.cleanup();
|
||
|
});
|
||
|
|
||
|
describe('Test components features', () => {
|
||
|
const data = {
|
||
|
labels: [],
|
||
|
};
|
||
|
const labelsPayload = [
|
||
|
{
|
||
|
name: 'label 3, repeatable and non-repeatable',
|
||
|
color: { name: 'tomato', red: 255, green: 99, blue: 71 },
|
||
|
colors: [{ name: 'red', red: 255, green: 0, blue: 0 }],
|
||
|
},
|
||
|
];
|
||
|
|
||
|
test.each(labelsPayload)('Create entity with components %o', async (label) => {
|
||
|
const res = await graphqlQuery({
|
||
|
query: /* GraphQL */ `
|
||
|
mutation createLabel($data: LabelInput!) {
|
||
|
createLabel(data: $data) {
|
||
|
data {
|
||
|
attributes {
|
||
|
name
|
||
|
color {
|
||
|
name
|
||
|
red
|
||
|
green
|
||
|
blue
|
||
|
}
|
||
|
colors {
|
||
|
name
|
||
|
red
|
||
|
green
|
||
|
blue
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
`,
|
||
|
variables: {
|
||
|
data: label,
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(200);
|
||
|
expect(res.body).toEqual({
|
||
|
data: {
|
||
|
createLabel: {
|
||
|
data: {
|
||
|
attributes: label,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('List entity with components', async () => {
|
||
|
const res = await graphqlQuery({
|
||
|
query: /* GraphQL */ `
|
||
|
{
|
||
|
labels {
|
||
|
data {
|
||
|
id
|
||
|
attributes {
|
||
|
name
|
||
|
color {
|
||
|
name
|
||
|
red
|
||
|
green
|
||
|
blue
|
||
|
}
|
||
|
colors {
|
||
|
name
|
||
|
red
|
||
|
green
|
||
|
blue
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
`,
|
||
|
});
|
||
|
|
||
|
const { body } = res;
|
||
|
|
||
|
expect(res.statusCode).toBe(200);
|
||
|
expect(body).toMatchObject({
|
||
|
data: {
|
||
|
labels: {
|
||
|
data: expect.arrayContaining(data.labels),
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
|
||
|
// assign for later use
|
||
|
data.labels = res.body.data.labels.data;
|
||
|
});
|
||
|
|
||
|
test('Entity with repeatable component filters', async () => {
|
||
|
const res = await graphqlQuery({
|
||
|
query: /* GraphQL */ `
|
||
|
{
|
||
|
labels {
|
||
|
data {
|
||
|
id
|
||
|
attributes {
|
||
|
name
|
||
|
color {
|
||
|
name
|
||
|
red
|
||
|
green
|
||
|
blue
|
||
|
}
|
||
|
colors(filters: { red: { eq: 255 } }) {
|
||
|
name
|
||
|
red
|
||
|
green
|
||
|
blue
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
`,
|
||
|
});
|
||
|
|
||
|
const { body } = res;
|
||
|
|
||
|
expect(res.statusCode).toBe(200);
|
||
|
expect(body).toMatchObject({
|
||
|
data: {
|
||
|
labels: {
|
||
|
data: expect.arrayContaining(data.labels),
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|