strapi/packages/strapi-plugin-graphql/test/graphqlRelations.test.e2e.js

405 lines
8.9 KiB
JavaScript
Raw Normal View History

// Helpers.
2019-05-06 15:33:25 +02:00
const { registerAndLogin } = require('../../../test/helpers/auth');
const { createAuthRequest } = require('../../../test/helpers/request');
2019-05-06 15:33:25 +02:00
const createModelsUtils = require('../../../test/helpers/models');
const _ = require('lodash');
let rq;
let graphqlQuery;
2019-05-06 15:33:25 +02:00
let modelsUtils;
// utils
const selectFields = doc => _.pick(doc, ['id', 'name']);
const documentModel = {
attributes: [
{
2019-03-28 15:08:00 +01:00
name: 'name',
params: {
multiple: false,
type: 'wysiwyg',
},
},
{
name: 'content',
params: {
multiple: false,
type: 'wysiwyg',
},
},
],
connection: 'default',
name: 'document',
description: '',
collectionName: '',
};
const labelModel = {
attributes: [
{
name: 'name',
params: {
multiple: false,
type: 'wysiwyg',
},
},
{
name: 'documents',
params: {
dominant: true,
nature: 'manyToMany',
target: 'document',
key: 'labels',
},
},
],
connection: 'default',
name: 'label',
description: '',
collectionName: '',
};
describe('Test Graphql Relations API End to End', () => {
beforeAll(async () => {
2019-05-06 15:33:25 +02:00
const token = await registerAndLogin();
rq = createAuthRequest(token);
graphqlQuery = body => {
return rq({
url: '/graphql',
method: 'POST',
body,
});
};
2019-05-06 15:33:25 +02:00
modelsUtils = createModelsUtils({ rq });
2019-05-06 15:33:25 +02:00
await modelsUtils.createModels([documentModel, labelModel]);
}, 60000);
afterAll(() => modelsUtils.deleteModels(['document', 'label']), 60000);
describe('Test relations features', () => {
let data = {
labels: [],
documents: [],
};
const labelsPayload = [{ name: 'label 1' }, { name: 'label 2' }];
2019-03-28 15:08:00 +01:00
const documentsPayload = [{ name: 'document 1' }, { name: 'document 2' }];
test.each(labelsPayload)('Create label %o', async label => {
const res = await graphqlQuery({
query: /* GraphQL */ `
mutation createLabel($input: createLabelInput) {
createLabel(input: $input) {
label {
name
}
}
}
`,
variables: {
input: {
data: label,
},
},
});
const { body } = res;
expect(res.statusCode).toBe(200);
expect(body).toEqual({
data: {
createLabel: {
label,
},
},
});
});
test('List labels', async () => {
const res = await graphqlQuery({
query: /* GraphQL */ `
{
labels {
id
name
}
}
`,
});
const { body } = res;
expect(res.statusCode).toBe(200);
expect(body).toMatchObject({
data: {
labels: labelsPayload,
},
});
// assign for later use
data.labels = res.body.data.labels;
});
2019-04-09 18:35:49 +02:00
test.each(documentsPayload)(
'Create document linked to every labels %o',
async document => {
const res = await graphqlQuery({
query: /* GraphQL */ `
mutation createDocument($input: createDocumentInput) {
createDocument(input: $input) {
document {
name
2019-04-09 18:35:49 +02:00
labels {
id
name
}
}
}
}
2019-04-09 18:35:49 +02:00
`,
variables: {
input: {
data: {
...document,
labels: data.labels.map(t => t.id),
},
},
},
2019-04-09 18:35:49 +02:00
});
2019-04-09 18:35:49 +02:00
const { body } = res;
2019-04-09 18:35:49 +02:00
expect(res.statusCode).toBe(200);
2019-04-09 18:35:49 +02:00
expect(body).toMatchObject({
data: {
createDocument: {
document: {
...selectFields(document),
labels: expect.arrayContaining(data.labels.map(selectFields)),
},
},
},
2019-04-09 18:35:49 +02:00
});
2019-05-06 15:33:25 +02:00
}
2019-04-09 18:35:49 +02:00
);
test('List documents with labels', async () => {
const res = await graphqlQuery({
query: /* GraphQL */ `
{
documents {
id
2019-03-28 15:08:00 +01:00
name
labels {
id
name
}
}
}
`,
});
const { body } = res;
expect(res.statusCode).toBe(200);
expect(body).toMatchObject({
2019-04-09 18:35:49 +02:00
data: {
documents: expect.arrayContaining(
data.documents.map(document => ({
...selectFields(document),
labels: expect.arrayContaining(data.labels.map(selectFields)),
2019-05-06 15:33:25 +02:00
}))
2019-04-09 18:35:49 +02:00
),
},
});
// assign for later use
data.documents = res.body.data.documents;
});
test('List Labels with documents', async () => {
const res = await graphqlQuery({
query: /* GraphQL */ `
{
labels {
id
name
documents {
id
2019-03-28 15:08:00 +01:00
name
}
}
}
`,
});
const { body } = res;
expect(res.statusCode).toBe(200);
expect(body).toMatchObject({
data: {
2019-03-28 15:08:00 +01:00
labels: expect.arrayContaining(
data.labels.map(label => ({
2019-03-28 15:08:00 +01:00
...selectFields(label),
2019-04-09 18:35:49 +02:00
documents: expect.arrayContaining(
2019-05-06 15:33:25 +02:00
data.documents.map(selectFields)
2019-04-09 18:35:49 +02:00
),
2019-05-06 15:33:25 +02:00
}))
2019-03-28 15:08:00 +01:00
),
},
});
// assign for later use
data.labels = res.body.data.labels;
});
test('Deep query', async () => {
const res = await graphqlQuery({
query: /* GraphQL */ `
{
documents(where: { labels: { name_contains: "label 1" } }) {
id
2019-03-28 15:08:00 +01:00
name
labels {
id
name
}
}
}
`,
});
expect(res.statusCode).toBe(200);
expect(res.body).toMatchObject({
data: {
2019-03-28 15:08:00 +01:00
documents: expect.arrayContaining(data.documents),
},
});
});
test('Update Document relations removes correctly a relation', async () => {
// if I remove a label from an document is it working
const res = await graphqlQuery({
query: /* GraphQL */ `
mutation updateDocument($input: updateDocumentInput) {
updateDocument(input: $input) {
document {
id
2019-03-28 15:08:00 +01:00
name
labels {
id
name
}
}
}
}
`,
variables: {
input: {
where: {
id: data.documents[0].id,
},
data: {
labels: [data.labels[0].id],
},
},
},
});
expect(res.statusCode).toBe(200);
expect(res.body).toMatchObject({
data: {
updateDocument: {
document: {
...selectFields(data.documents[0]),
labels: [selectFields(data.labels[0])],
},
},
},
});
});
test('Delete Labels and test Documents relations', async () => {
for (let label of data.labels) {
const res = await graphqlQuery({
query: /* GraphQL */ `
mutation deleteLabel($input: deleteLabelInput) {
deleteLabel(input: $input) {
label {
name
}
}
}
`,
variables: {
input: {
where: {
id: label.id,
},
},
},
});
expect(res.statusCode).toBe(200);
}
const res = await graphqlQuery({
query: /* GraphQL */ `
{
documents {
id
2019-03-28 15:08:00 +01:00
name
labels {
id
name
}
}
}
`,
});
const { body } = res;
expect(res.statusCode).toBe(200);
expect(body).toMatchObject({
data: {
2019-03-28 15:08:00 +01:00
documents: expect.arrayContaining(
data.documents.map(document => ({
...selectFields(document),
labels: [],
2019-05-06 15:33:25 +02:00
}))
2019-03-28 15:08:00 +01:00
),
},
});
});
test('Delete Documents', async () => {
for (let document of data.documents) {
const res = await graphqlQuery({
query: /* GraphQL */ `
mutation deleteDocument($input: deleteDocumentInput) {
deleteDocument(input: $input) {
document {
2019-03-28 15:08:00 +01:00
name
}
}
}
`,
variables: {
input: {
where: {
id: document.id,
},
},
},
});
expect(res.statusCode).toBe(200);
}
});
});
});