strapi/packages/plugins/graphql/tests/graphql-crud.test.e2e.js

461 lines
9.5 KiB
JavaScript
Raw Normal View History

'use strict';
// Helpers.
2021-04-29 11:11:46 +02:00
const { createTestBuilder } = require('../../../../test/helpers/builder');
const { createStrapiInstance } = require('../../../../test/helpers/strapi');
const { createAuthRequest } = require('../../../../test/helpers/request');
const builder = createTestBuilder();
let strapi;
let rq;
let graphqlQuery;
const postModel = {
2019-11-14 16:37:57 +01:00
attributes: {
name: {
type: 'richtext',
},
2019-11-14 16:37:57 +01:00
bigint: {
type: 'biginteger',
2019-04-05 07:45:56 -07:00
},
2019-11-14 16:37:57 +01:00
nullable: {
type: 'string',
2019-07-04 19:10:17 -03:00
},
2019-11-14 16:37:57 +01:00
},
name: 'post',
description: '',
collectionName: '',
};
describe('Test Graphql API End to End', () => {
beforeAll(async () => {
await builder.addContentType(postModel).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 CRUD', () => {
2019-05-06 15:33:25 +02:00
const postsPayload = [
2019-07-04 19:10:17 -03:00
{ name: 'post 1', bigint: 1316130638171, nullable: 'value' },
{ name: 'post 2', bigint: 1416130639261, nullable: null },
2019-05-06 15:33:25 +02:00
];
let data = {
posts: [],
};
test.each(postsPayload)('Create Post %o', async post => {
const res = await graphqlQuery({
query: /* GraphQL */ `
mutation createPost($input: createPostInput) {
createPost(input: $input) {
post {
name
2019-04-05 07:45:56 -07:00
bigint
2019-07-04 19:10:17 -03:00
nullable
}
}
}
`,
variables: {
input: {
data: post,
},
},
});
const { body } = res;
expect(res.statusCode).toBe(200);
expect(body).toEqual({
data: {
createPost: {
post,
},
},
});
});
test('List posts', async () => {
const res = await graphqlQuery({
query: /* GraphQL */ `
{
posts {
id
name
2019-04-05 07:45:56 -07:00
bigint
2019-07-04 19:10:17 -03:00
nullable
}
}
`,
});
const { body } = res;
expect(res.statusCode).toBe(200);
expect(body).toMatchObject({
data: {
posts: postsPayload,
},
});
// assign for later use
data.posts = res.body.data.posts;
});
test('List posts with limit', async () => {
const res = await graphqlQuery({
query: /* GraphQL */ `
{
posts(limit: 1) {
id
name
2019-04-05 07:45:56 -07:00
bigint
2019-07-04 19:10:17 -03:00
nullable
}
}
`,
});
expect(res.statusCode).toBe(200);
expect(res.body).toEqual({
data: {
posts: [data.posts[0]],
},
});
});
test('List posts with sort', async () => {
const res = await graphqlQuery({
query: /* GraphQL */ `
{
posts(sort: "name:desc") {
id
name
2019-04-05 07:45:56 -07:00
bigint
2019-07-04 19:10:17 -03:00
nullable
}
}
`,
});
expect(res.statusCode).toBe(200);
expect(res.body).toEqual({
data: {
posts: [...data.posts].reverse(),
},
});
});
test('List posts with start', async () => {
const res = await graphqlQuery({
query: /* GraphQL */ `
{
posts(start: 1) {
id
name
2019-04-05 07:45:56 -07:00
bigint
2019-07-04 19:10:17 -03:00
nullable
}
}
`,
});
expect(res.statusCode).toBe(200);
expect(res.body).toEqual({
data: {
posts: [data.posts[1]],
},
});
});
Hide creator fields from public api by default (#8052) * Add model option to hide/show creators fields in public API response Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Add content-types util, rework sanitize-entity's private handling Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Update search e2e tests, fix an issue on empty search for the core-api controller (find) Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Fix GraphQL plugin (handle privates attributes on typeDefs + resolver builds) Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Fix sanitizeEntity import Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Move doc update from beta to stable Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Fix e2e test Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Fix pr comments Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Remove creator's field from upload controller routes Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Fix typedef build for graphql association Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Fix pr (comments + several issues) Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Add tests for search behavior in content-manager Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Rename files variables to meaningful names (upload controllers) Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> * Fix test with search id matching serialNumber Signed-off-by: Alexandre Bodin <bodin.alex@gmail.com> * Add toHasBeenCalledWith check for config.get (utils/content-types.test.js) Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu> Co-authored-by: Alexandre Bodin <bodin.alex@gmail.com>
2020-10-01 17:47:08 +02:00
test.skip('List posts with `created_by` and `updated_by`', async () => {
const res = await graphqlQuery({
query: /* GraphQL */ `
{
posts(start: 1) {
id
name
bigint
nullable
created_by {
username
}
updated_by {
username
}
}
}
`,
});
expect(res.statusCode).toBe(200);
// no errors should be present in the response
expect(res.body.error).toBeUndefined();
// since the posts are created without AdminUser, it should return null
expect(res.body.data.posts[0].created_by).toBeNull();
});
test.each([
[
{
name: 'post 1',
2019-04-05 07:45:56 -07:00
bigint: 1316130638171,
},
[postsPayload[0]],
],
[
{
name_eq: 'post 1',
2019-04-05 07:45:56 -07:00
bigint_eq: 1316130638171,
},
[postsPayload[0]],
],
[
{
name_ne: 'post 1',
2019-04-05 07:45:56 -07:00
bigint_ne: 1316130638171,
},
[postsPayload[1]],
],
[
{
name_contains: 'Post',
},
postsPayload,
],
[
{
name_contains: 'Post 1',
},
[postsPayload[0]],
],
[
{
name_containss: 'post',
},
postsPayload,
],
[
{
name_ncontainss: 'post 1',
},
[postsPayload[1]],
],
[
{
2019-07-04 19:10:17 -03:00
name_in: ['post 1', 'post 2', 'post 3'],
},
postsPayload,
],
[
{
name_nin: ['post 2'],
},
[postsPayload[0]],
],
2019-07-04 19:10:17 -03:00
[
{
nullable_null: true,
},
[postsPayload[1]],
],
[
{
nullable_null: false,
},
[postsPayload[0]],
],
[
{
_or: [{ name_in: ['post 2'] }, { bigint_eq: 1316130638171 }],
},
[postsPayload[0], postsPayload[1]],
],
[
{
_where: { nullable_null: false },
},
[postsPayload[0]],
],
[
{
_where: { _or: { nullable_null: false } },
},
[postsPayload[0]],
],
[
{
_where: [{ nullable_null: false }],
},
[postsPayload[0]],
],
[
{
_where: [{ _or: [{ name_in: ['post 2'] }, { bigint_eq: 1316130638171 }] }],
},
[postsPayload[0], postsPayload[1]],
],
[
{
_where: [
{
_or: [
{ name_in: ['post 2'] },
{ _or: [{ bigint_eq: 1316130638171 }, { nullable_null: false }] },
],
},
],
},
[postsPayload[0], postsPayload[1]],
],
])('List posts with where clause %o', async (where, expected) => {
const res = await graphqlQuery({
query: /* GraphQL */ `
query findPosts($where: JSON) {
posts(where: $where) {
name
2019-04-05 07:45:56 -07:00
bigint
2019-07-04 19:10:17 -03:00
nullable
}
}
`,
variables: {
where,
},
});
expect(res.statusCode).toBe(200);
2019-05-13 13:59:41 +02:00
// same length
expect(res.body.data.posts.length).toBe(expected.length);
// all the posts returned are in the expected array
res.body.data.posts.forEach(post => {
expect(expected).toEqual(expect.arrayContaining([post]));
});
// all expected values are in the result
expected.forEach(expectedPost => {
expect(res.body.data.posts).toEqual(expect.arrayContaining([expectedPost]));
});
});
test('Get One Post', async () => {
const res = await graphqlQuery({
query: /* GraphQL */ `
query getPost($id: ID!) {
post(id: $id) {
id
name
2019-04-05 07:45:56 -07:00
bigint
2019-07-04 19:10:17 -03:00
nullable
}
}
`,
variables: {
id: data.posts[0].id,
},
});
expect(res.statusCode).toBe(200);
expect(res.body).toEqual({
data: {
post: data.posts[0],
},
});
});
test('Update Post', async () => {
const newName = 'new post name';
const res = await graphqlQuery({
query: /* GraphQL */ `
mutation updatePost($input: updatePostInput) {
updatePost(input: $input) {
post {
id
name
}
}
}
`,
variables: {
input: {
where: {
id: data.posts[0].id,
},
data: {
name: newName,
},
},
},
});
expect(res.statusCode).toBe(200);
expect(res.body).toEqual({
data: {
updatePost: {
post: {
id: data.posts[0].id,
name: newName,
},
},
},
});
data.posts[0] = res.body.data.updatePost.post;
});
test('Delete Posts', async () => {
for (let post of data.posts) {
const res = await graphqlQuery({
query: /* GraphQL */ `
mutation deletePost($input: deletePostInput) {
deletePost(input: $input) {
post {
2019-08-23 14:15:24 +02:00
id
name
2019-04-05 07:45:56 -07:00
bigint
}
}
}
`,
variables: {
input: {
where: {
id: post.id,
},
},
},
});
expect(res.statusCode).toBe(200);
2019-08-23 14:15:24 +02:00
expect(res.body).toMatchObject({
data: {
deletePost: {
post: {
id: post.id,
},
},
},
});
}
});
});
});