import supertest from 'supertest';
import { server, logInUser, id, createRole } from '../helpers';

describe('PATCH /auth/roles/:roleID', () => {
  it('should return 403 if user is not logged in', async () => {
    const res = await supertest(server)
      .patch('/api/v1/auth/roles/:roleID')
      .send();

    expect(res.status).toBe(403);
  });

  it('should return 403 if has no permissions', async () => {
    const roleId = id();
    const res = await supertest(server)
      .patch(`/api/v1/auth/roles/${roleId}`)
      .set('Authorization', await logInUser())
      .send({
        role: 'admin',
        permissions: ['create_user', 'create_dispatchers', 'create_roles'],
      });

    expect(res.status).toBe(403);
  });

  it('should return 404 if role does not exist', async () => {
    const roleId = id();
    const editRoleId = id();
    const companyId = id();
    await createRole({
      _id: roleId,
      company_id: companyId,
      permissions: ['create_roles'],
    });

    const res = await supertest(server)
      .patch(`/api/v1/auth/roles/${editRoleId}`)
      .set(
        'Authorization',
        await logInUser({ role_id: roleId, company_id: companyId }),
      )
      .send({
        role: 'admin',
        permissions: ['create_user', 'create_dispatchers', 'create_roles'],
      });
    expect(res.status).toBe(404);
    expect(res.body).toMatchObject({
      success: false,
      message: 'Role does not exist',
    });
  });

  it('should return 201 and correct data', async () => {
    const roleId = id();
    const editRoleId = id();
    const companyId = id();
    await createRole({
      _id: roleId,
      company_id: companyId,
      permissions: ['create_roles'],
    });

    await createRole({
      _id: editRoleId,
      company_id: companyId,
      permissions: ['create_roles'],
    });

    const res = await supertest(server)
      .patch(`/api/v1/auth/roles/${editRoleId}`)
      .set(
        'Authorization',
        await logInUser({ role_id: roleId, company_id: companyId }),
      )
      .send({
        role: 'admin',
        permissions: ['create_user', 'create_dispatchers', 'create_roles'],
      });

    expect(res.status).toBe(201);
    expect(res.body).toMatchObject({
      success: true,
      message: 'Role updated successfully',
      data: expect.any(Object),
    });
    expect(res.body.data.role.permissions).toMatchObject([
      'create_user',
      'create_dispatchers',
      'create_roles',
    ]);
  });
});
