text: const { graphql } = require('graphql');
  
  const schema = require('../../../../graph/schema');
  const Context = require('../../../../graph/context');
  const SettingsService = require('../../../../services/settings');
  const UsersService = require('../../../../services/users');
  
  const { expect } = require('chai');
  
  describe('graph.mutations.changeUsername', () => {
    let user;
    beforeEach(async () => {
      await SettingsService.init();
      user = await UsersService.createLocalUser(
        'test@test.com',
        'testpassword1!',
        'kirk'
      );
  
      expect(user).to.have.property('username', 'kirk');
      expect(user).to.have.property('lowercaseUsername', 'kirk');
      expect(user.status.username.status).to.equal('SET');
    });
  
    const changeUsernameMutation = `
      mutation ChangeUsername($user_id: ID!, $username: String!) {
        changeUsername(id: $user_id, username: $username) {
          errors {
            translation_key
          }
        }
      }
  
      query User {
        me {
          state {
            status {
              username {
                history {
                  status
                  assigned_by {
                    username
                  }
                  created_at
                }
              }
            }
          }
        }
      }
    `;
  
    [
      { role: 'COMMENTER' },
      { role: 'STAFF' },
      { role: 'COMMENTER' },
      { role: 'MODERATOR' },
      { role: 'ADMIN' },
    ].forEach(({ role }) => {
      it(`can change the username with roles ${role}`, async () => {
        let username = 'spock';
  
        // Update the user role.
        await UsersService.setRole(user.id, role);
        user.role = role;
  
        let ctx = new Context({ user });
  
        let res = await graphql(
          schema,
          changeUsernameMutation,
          {},
          ctx,
          {
            user_id: user.id,
            username,
          },
          'ChangeUsername'
        );
  
        if (res.errors && res.errors.length > 0) {
          console.error(res.errors);
        }
  
        expect(res.errors).to.be.undefined;
        expect(res.data.changeUsername).to.have.property('errors');
        expect(res.data.changeUsername.errors).to.have.length(1);
        expect(res.data.changeUsername.errors[0]).to.have.property(
          'translation_key',
          'NOT_AUTHORIZED'
        );
  
        // Set the user to the desired status.
        user = await UsersService.setUsernameStatus(user.id, 'REJECTED');
  
        expect(user.status.username.status, 'REJECTED');
  
        ctx = new Context({ user });
  
        res = await graphql(
          schema,
          changeUsernameMutation,
          {},
          ctx,
          {
            user_id: user.id,
            username,
          },
          'ChangeUsername'
        );
  
        if (res.errors && res.errors.length > 0) {
          console.error(res.errors);
        }
  
        expect(res.errors).to.be.undefined;
        expect(res.data.changeUsername).to.be.null;
  
        res = await graphql(schema, changeUsernameMutation, {}, ctx, {}, 'User');
  
        if (res.errors && res.errors.length > 0) {
          console.error(res.errors);
        }
  
        expect(res.errors).to.be.undefined;
  
        expect(res.data.me.state.status.username.status, 'CHANGED');
      });
    });
  });
  