mirror of
https://github.com/strapi/strapi.git
synced 2025-08-01 13:29:01 +00:00

* 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>
415 lines
8.6 KiB
JavaScript
415 lines
8.6 KiB
JavaScript
// Helpers.
|
|
const { registerAndLogin } = require('../../../test/helpers/auth');
|
|
const createModelsUtils = require('../../../test/helpers/models');
|
|
const { createAuthRequest } = require('../../../test/helpers/request');
|
|
|
|
let rq;
|
|
let graphqlQuery;
|
|
let modelsUtils;
|
|
|
|
const postModel = {
|
|
attributes: {
|
|
name: {
|
|
type: 'richtext',
|
|
},
|
|
bigint: {
|
|
type: 'biginteger',
|
|
},
|
|
nullable: {
|
|
type: 'string',
|
|
},
|
|
},
|
|
connection: 'default',
|
|
name: 'post',
|
|
description: '',
|
|
collectionName: '',
|
|
};
|
|
|
|
describe('Test Graphql API End to End', () => {
|
|
beforeAll(async () => {
|
|
const token = await registerAndLogin();
|
|
rq = createAuthRequest(token);
|
|
|
|
graphqlQuery = body => {
|
|
return rq({
|
|
url: '/graphql',
|
|
method: 'POST',
|
|
body,
|
|
});
|
|
};
|
|
|
|
modelsUtils = createModelsUtils({ rq });
|
|
|
|
await modelsUtils.createContentTypes([postModel]);
|
|
}, 60000);
|
|
|
|
afterAll(() => modelsUtils.deleteContentTypes(['post']), 60000);
|
|
|
|
describe('Test CRUD', () => {
|
|
const postsPayload = [
|
|
{ name: 'post 1', bigint: 1316130638171, nullable: 'value' },
|
|
{ name: 'post 2', bigint: 1416130639261, nullable: null },
|
|
];
|
|
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
|
|
bigint
|
|
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
|
|
bigint
|
|
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
|
|
bigint
|
|
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
|
|
bigint
|
|
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
|
|
bigint
|
|
nullable
|
|
}
|
|
}
|
|
`,
|
|
});
|
|
|
|
expect(res.statusCode).toBe(200);
|
|
expect(res.body).toEqual({
|
|
data: {
|
|
posts: [data.posts[1]],
|
|
},
|
|
});
|
|
});
|
|
|
|
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',
|
|
bigint: 1316130638171,
|
|
},
|
|
[postsPayload[0]],
|
|
],
|
|
[
|
|
{
|
|
name_eq: 'post 1',
|
|
bigint_eq: 1316130638171,
|
|
},
|
|
[postsPayload[0]],
|
|
],
|
|
[
|
|
{
|
|
name_ne: 'post 1',
|
|
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]],
|
|
],
|
|
[
|
|
{
|
|
name_in: ['post 1', 'post 2', 'post 3'],
|
|
},
|
|
postsPayload,
|
|
],
|
|
[
|
|
{
|
|
name_nin: ['post 2'],
|
|
},
|
|
[postsPayload[0]],
|
|
],
|
|
[
|
|
{
|
|
nullable_null: true,
|
|
},
|
|
[postsPayload[1]],
|
|
],
|
|
[
|
|
{
|
|
nullable_null: false,
|
|
},
|
|
[postsPayload[0]],
|
|
],
|
|
])('List posts with where clause %o', async (where, expected) => {
|
|
const res = await graphqlQuery({
|
|
query: /* GraphQL */ `
|
|
query findPosts($where: JSON) {
|
|
posts(where: $where) {
|
|
name
|
|
bigint
|
|
nullable
|
|
}
|
|
}
|
|
`,
|
|
variables: {
|
|
where,
|
|
},
|
|
});
|
|
|
|
expect(res.statusCode).toBe(200);
|
|
|
|
// 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
|
|
bigint
|
|
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 {
|
|
id
|
|
name
|
|
bigint
|
|
}
|
|
}
|
|
}
|
|
`,
|
|
variables: {
|
|
input: {
|
|
where: {
|
|
id: post.id,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.statusCode).toBe(200);
|
|
expect(res.body).toMatchObject({
|
|
data: {
|
|
deletePost: {
|
|
post: {
|
|
id: post.id,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
}
|
|
});
|
|
});
|
|
});
|