mirror of
				https://github.com/strapi/strapi.git
				synced 2025-10-31 01:47:13 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			509 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			509 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| const { createStrapiInstance } = require('api-tests/strapi');
 | |
| const { createRequest, createAuthRequest } = require('api-tests/request');
 | |
| const { createTestBuilder } = require('api-tests/builder');
 | |
| 
 | |
| // Test a simple default API with no relations
 | |
| describe('Simple Test GraphQL Users API End to End', () => {
 | |
|   let strapi;
 | |
|   let rq;
 | |
|   let graphqlQuery;
 | |
|   const user = {
 | |
|     username: 'User 1',
 | |
|     email: 'user1@strapi.io',
 | |
|     password: 'test1234',
 | |
|   };
 | |
|   const data = {};
 | |
| 
 | |
|   beforeAll(async () => {
 | |
|     strapi = await createStrapiInstance();
 | |
|     rq = await createRequest({ strapi });
 | |
| 
 | |
|     graphqlQuery = (body) => {
 | |
|       return rq({
 | |
|         url: '/graphql',
 | |
|         method: 'POST',
 | |
|         body,
 | |
|       });
 | |
|     };
 | |
|   });
 | |
| 
 | |
|   afterAll(async () => {
 | |
|     await strapi.destroy();
 | |
|   });
 | |
| 
 | |
|   describe('Test register and login', () => {
 | |
|     test('Register a user', async () => {
 | |
|       const res = await graphqlQuery({
 | |
|         query: /* GraphQL */ `
 | |
|           mutation register($input: UsersPermissionsRegisterInput!) {
 | |
|             register(input: $input) {
 | |
|               jwt
 | |
|               user {
 | |
|                 id
 | |
|                 email
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         `,
 | |
|         variables: {
 | |
|           input: user,
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       const { body } = res;
 | |
| 
 | |
|       expect(res.statusCode).toBe(200);
 | |
|       expect(body).toMatchObject({
 | |
|         data: {
 | |
|           register: {
 | |
|             jwt: expect.any(String),
 | |
|             user: {
 | |
|               id: expect.any(String),
 | |
|               email: user.email,
 | |
|             },
 | |
|           },
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       data.user = res.body.data.register.user;
 | |
|     });
 | |
| 
 | |
|     test('Log in a user', async () => {
 | |
|       const res = await graphqlQuery({
 | |
|         query: /* GraphQL */ `
 | |
|           mutation login($input: UsersPermissionsLoginInput!) {
 | |
|             login(input: $input) {
 | |
|               jwt
 | |
|               user {
 | |
|                 id
 | |
|                 email
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         `,
 | |
|         variables: {
 | |
|           input: {
 | |
|             identifier: user.username,
 | |
|             password: user.password,
 | |
|           },
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       const { body } = res;
 | |
| 
 | |
|       expect(res.statusCode).toBe(200);
 | |
|       expect(body).toMatchObject({
 | |
|         data: {
 | |
|           login: {
 | |
|             jwt: expect.any(String),
 | |
|             user: {
 | |
|               id: expect.any(String),
 | |
|               email: user.email,
 | |
|             },
 | |
|           },
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       // Use the JWT returned by the login request to
 | |
|       // authentify the next queries or mutations
 | |
|       rq.setLoggedUser(user).setToken(res.body.data.login.jwt);
 | |
| 
 | |
|       data.user = res.body.data.login.user;
 | |
|     });
 | |
| 
 | |
|     test('Update a user', async () => {
 | |
|       const res = await graphqlQuery({
 | |
|         query: /* GraphQL */ `
 | |
|           mutation updateUser($id: ID!, $data: UsersPermissionsUserInput!) {
 | |
|             updateUsersPermissionsUser(id: $id, data: $data) {
 | |
|               data {
 | |
|                 attributes {
 | |
|                   username
 | |
|                   email
 | |
|                 }
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         `,
 | |
|         variables: {
 | |
|           id: data.user.id,
 | |
|           data: { username: 'User Test' },
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       const { body } = res;
 | |
| 
 | |
|       expect(res.statusCode).toBe(200);
 | |
|       expect(body).toMatchObject({
 | |
|         data: {
 | |
|           updateUsersPermissionsUser: {
 | |
|             data: {
 | |
|               attributes: {
 | |
|                 username: 'User Test',
 | |
|                 email: data.user.email,
 | |
|               },
 | |
|             },
 | |
|           },
 | |
|         },
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     test('Delete a user', async () => {
 | |
|       const res = await graphqlQuery({
 | |
|         query: /* GraphQL */ `
 | |
|           mutation deleteUser($id: ID!) {
 | |
|             deleteUsersPermissionsUser(id: $id) {
 | |
|               data {
 | |
|                 attributes {
 | |
|                   username
 | |
|                   email
 | |
|                 }
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         `,
 | |
|         variables: {
 | |
|           id: data.user.id,
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       const { body } = res;
 | |
| 
 | |
|       expect(res.statusCode).toBe(200);
 | |
|       expect(body).toMatchObject({
 | |
|         data: {
 | |
|           deleteUsersPermissionsUser: {
 | |
|             data: {
 | |
|               attributes: {
 | |
|                 username: 'User Test',
 | |
|                 email: data.user.email,
 | |
|               },
 | |
|             },
 | |
|           },
 | |
|         },
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| });
 | |
| 
 | |
| // Test with attributes such as components, relations..
 | |
| describe('Advanced Test GraphQL Users API End to End', () => {
 | |
|   const builder = createTestBuilder();
 | |
| 
 | |
|   let strapi;
 | |
|   let rq;
 | |
|   let authReq;
 | |
|   let graphqlQuery;
 | |
|   const user = {
 | |
|     username: 'User 2',
 | |
|     email: 'user2@strapi.io',
 | |
|     password: 'test1234',
 | |
|   };
 | |
|   const component = {
 | |
|     displayName: 'somecomponent',
 | |
|     attributes: {
 | |
|       name: {
 | |
|         type: 'string',
 | |
|       },
 | |
|       isTesting: {
 | |
|         type: 'boolean',
 | |
|       },
 | |
|     },
 | |
|   };
 | |
|   const data = {};
 | |
| 
 | |
|   const restart = async () => {
 | |
|     await strapi.destroy();
 | |
|     strapi = await createStrapiInstance();
 | |
|     rq = await createAuthRequest({ strapi });
 | |
|     authReq = await createAuthRequest({ strapi });
 | |
| 
 | |
|     graphqlQuery = (body) => {
 | |
|       return rq({
 | |
|         url: '/graphql',
 | |
|         method: 'POST',
 | |
|         body,
 | |
|       });
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   beforeAll(async () => {
 | |
|     await builder.addComponent(component).build();
 | |
| 
 | |
|     strapi = await createStrapiInstance();
 | |
|     rq = await createRequest({ strapi });
 | |
|     authReq = await createAuthRequest({ strapi });
 | |
| 
 | |
|     graphqlQuery = (body) => {
 | |
|       return rq({
 | |
|         url: '/graphql',
 | |
|         method: 'POST',
 | |
|         body,
 | |
|       });
 | |
|     };
 | |
|   });
 | |
| 
 | |
|   afterAll(async () => {
 | |
|     await strapi.destroy();
 | |
|     await builder.cleanup();
 | |
|   });
 | |
| 
 | |
|   test('Update user to add component attribute', async () => {
 | |
|     const uid = 'plugin::users-permissions.user';
 | |
| 
 | |
|     const res = await authReq({
 | |
|       method: 'PUT',
 | |
|       url: `/content-type-builder/content-types/${uid}`,
 | |
|       body: {
 | |
|         contentType: {
 | |
|           displayName: 'User',
 | |
|           singularName: 'user',
 | |
|           pluralName: 'users',
 | |
|           description: '',
 | |
|           draftAndPublish: false,
 | |
|           kind: 'collectionType',
 | |
|           collectionName: 'up_users',
 | |
|           attributes: {
 | |
|             username: {
 | |
|               type: 'string',
 | |
|               minLength: 3,
 | |
|               unique: true,
 | |
|               configurable: false,
 | |
|               required: true,
 | |
|             },
 | |
|             email: {
 | |
|               type: 'email',
 | |
|               minLength: 6,
 | |
|               configurable: false,
 | |
|               required: true,
 | |
|             },
 | |
|             provider: {
 | |
|               type: 'string',
 | |
|               configurable: false,
 | |
|             },
 | |
|             password: {
 | |
|               type: 'password',
 | |
|               minLength: 6,
 | |
|               configurable: false,
 | |
|               private: true,
 | |
|             },
 | |
|             resetPasswordToken: {
 | |
|               type: 'string',
 | |
|               configurable: false,
 | |
|               private: true,
 | |
|             },
 | |
|             confirmationToken: {
 | |
|               type: 'string',
 | |
|               configurable: false,
 | |
|               private: true,
 | |
|             },
 | |
|             confirmed: {
 | |
|               type: 'boolean',
 | |
|               default: false,
 | |
|               configurable: false,
 | |
|             },
 | |
|             blocked: {
 | |
|               type: 'boolean',
 | |
|               default: false,
 | |
|               configurable: false,
 | |
|             },
 | |
|             role: {
 | |
|               type: 'relation',
 | |
|               relation: 'manyToOne',
 | |
|               target: 'plugin::users-permissions.role',
 | |
|               inversedBy: 'users',
 | |
|               configurable: false,
 | |
|             },
 | |
|             someComponent: {
 | |
|               type: 'component',
 | |
|               repeatable: false,
 | |
|               component: 'default.somecomponent',
 | |
|             },
 | |
|           },
 | |
|         },
 | |
|       },
 | |
|     });
 | |
| 
 | |
|     expect(res.statusCode).toBe(201);
 | |
|     expect(res.body).toEqual({
 | |
|       data: {
 | |
|         uid,
 | |
|       },
 | |
|     });
 | |
| 
 | |
|     await restart();
 | |
|   });
 | |
| 
 | |
|   describe('Test register and login with component', () => {
 | |
|     test('Register a user', async () => {
 | |
|       const res = await graphqlQuery({
 | |
|         query: /* GraphQL */ `
 | |
|           mutation register($input: UsersPermissionsRegisterInput!) {
 | |
|             register(input: $input) {
 | |
|               jwt
 | |
|               user {
 | |
|                 id
 | |
|                 email
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         `,
 | |
|         variables: {
 | |
|           input: user,
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       const { body } = res;
 | |
| 
 | |
|       expect(res.statusCode).toBe(200);
 | |
|       expect(body).toMatchObject({
 | |
|         data: {
 | |
|           register: {
 | |
|             jwt: expect.any(String),
 | |
|             user: {
 | |
|               id: expect.any(String),
 | |
|               email: user.email,
 | |
|             },
 | |
|           },
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       data.user = res.body.data.register.user;
 | |
|     });
 | |
| 
 | |
|     test('Log in a user', async () => {
 | |
|       const res = await graphqlQuery({
 | |
|         query: /* GraphQL */ `
 | |
|           mutation login($input: UsersPermissionsLoginInput!) {
 | |
|             login(input: $input) {
 | |
|               jwt
 | |
|               user {
 | |
|                 id
 | |
|                 email
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         `,
 | |
|         variables: {
 | |
|           input: {
 | |
|             identifier: user.username,
 | |
|             password: user.password,
 | |
|           },
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       const { body } = res;
 | |
| 
 | |
|       expect(res.statusCode).toBe(200);
 | |
|       expect(body).toMatchObject({
 | |
|         data: {
 | |
|           login: {
 | |
|             jwt: expect.any(String),
 | |
|             user: {
 | |
|               id: expect.any(String),
 | |
|               email: user.email,
 | |
|             },
 | |
|           },
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       // Use the JWT returned by the login request to
 | |
|       // authentify the next queries or mutations
 | |
|       rq.setLoggedUser(user).setToken(res.body.data.login.jwt);
 | |
| 
 | |
|       data.user = res.body.data.login.user;
 | |
|     });
 | |
| 
 | |
|     test('Update a user', async () => {
 | |
|       const res = await graphqlQuery({
 | |
|         query: /* GraphQL */ `
 | |
|           mutation updateUser($id: ID!, $data: UsersPermissionsUserInput!) {
 | |
|             updateUsersPermissionsUser(id: $id, data: $data) {
 | |
|               data {
 | |
|                 attributes {
 | |
|                   username
 | |
|                   email
 | |
|                   someComponent {
 | |
|                     name
 | |
|                     isTesting
 | |
|                   }
 | |
|                 }
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         `,
 | |
|         variables: {
 | |
|           id: data.user.id,
 | |
|           data: {
 | |
|             username: 'User Test',
 | |
|             someComponent: { name: 'Changed Name', isTesting: false },
 | |
|           },
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       const { body } = res;
 | |
| 
 | |
|       expect(res.statusCode).toBe(200);
 | |
|       expect(body).toMatchObject({
 | |
|         data: {
 | |
|           updateUsersPermissionsUser: {
 | |
|             data: {
 | |
|               attributes: {
 | |
|                 username: 'User Test',
 | |
|                 email: data.user.email,
 | |
|                 someComponent: {
 | |
|                   name: 'Changed Name',
 | |
|                   isTesting: false,
 | |
|                 },
 | |
|               },
 | |
|             },
 | |
|           },
 | |
|         },
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     test('Delete a user', async () => {
 | |
|       const res = await graphqlQuery({
 | |
|         query: /* GraphQL */ `
 | |
|           mutation deleteUser($id: ID!) {
 | |
|             deleteUsersPermissionsUser(id: $id) {
 | |
|               data {
 | |
|                 attributes {
 | |
|                   username
 | |
|                   email
 | |
|                   someComponent {
 | |
|                     name
 | |
|                     isTesting
 | |
|                   }
 | |
|                 }
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         `,
 | |
|         variables: {
 | |
|           id: data.user.id,
 | |
|         },
 | |
|       });
 | |
| 
 | |
|       const { body } = res;
 | |
| 
 | |
|       expect(res.statusCode).toBe(200);
 | |
|       expect(body).toMatchObject({
 | |
|         data: {
 | |
|           deleteUsersPermissionsUser: {
 | |
|             data: {
 | |
|               attributes: {
 | |
|                 username: 'User Test',
 | |
|                 email: data.user.email,
 | |
|                 someComponent: null,
 | |
|               },
 | |
|             },
 | |
|           },
 | |
|         },
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| });
 | 
