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

describe('PATCH /auth/user-activation/:userID/{staff||rider}}', () => {
  it('should return 403 if user is not logged in', async () => {
    const res = await supertest(server)
      .patch('/api/v1/auth/user-activation/:userID/staff')
      .send();

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

  it('should return 400 if user does not pass the necessary details', async () => {
    const res = await supertest(server)
      .patch('/api/v1/auth/user-activation/:userID/staf')
      .set('Authorization', await logInUser())
      .send();

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

  it('should return 403 if user does not have permission', async () => {
    const userId = id();
    const res = await supertest(server)
      .patch(`/api/v1/auth/user-activation/${userId}/staff`)
      .set('Authorization', await logInUser())
      .query({ action: 'activate' })
      .send();

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

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

    const res = await supertest(server)
      .patch(`/api/v1/auth/user-activation/${userId}/staff`)
      .set(
        'Authorization',
        await logInUser({ role_id: roleId, company_id: companyId }),
      )
      .query({ action: 'activate' })
      .send();

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

  it('should return 401 if user is already activated', async () => {
    const roleId = id();
    const userId = id();
    const companyId = id();
    await createRole({
      _id: roleId,
      company_id: companyId,
      permissions: ['activate_staff'],
    });

    await createTestUser({
      _id: userId,
      company_id: companyId,
      isActive: true,
    });

    const res = await supertest(server)
      .patch(`/api/v1/auth/user-activation/${userId}/staff`)
      .set(
        'Authorization',
        await logInUser({ role_id: roleId, company_id: companyId }),
      )
      .query({ action: 'activate' })
      .send();

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

  it('should return 201 if has permissions', async () => {
    const roleId = id();
    const userId = id();
    const companyId = id();
    await createRole({
      _id: roleId,
      company_id: companyId,
      permissions: ['activate_staff'],
    });

    await createTestUser({
      _id: userId,
      company_id: companyId,
      isActive: false,
    });

    const res = await supertest(server)
      .patch(`/api/v1/auth/user-activation/${userId}/staff`)
      .set(
        'Authorization',
        await logInUser({ role_id: roleId, company_id: companyId }),
      )
      .query({ action: 'activate' })
      .send();

    expect(res.status).toBe(201);
    expect(res.body).toMatchObject({
      success: true,
      message: 'User activated successfully',
    });
  });

  it('should return 403 if user does not have permission', async () => {
    const roleId = id();
    const userId = id();
    const companyId = id();
    await createRider({ _id: userId, company_id: companyId });
    const res = await supertest(server)
      .patch(`/api/v1/auth/user-activation/${userId}/rider`)
      .set(
        'Authorization',
        await logInUser({ role_id: roleId, company_id: companyId }),
      )
      .query({ action: 'activate' })
      .send();

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

  it('should return 201 and correct response', async () => {
    const roleId = id();
    const userId = id();
    const companyId = id();
    await createRider({
      _id: userId,
      company_id: companyId,
      email: 'abc@email',
      phoneNumber: '+2348012345690',
    });
    await createRole({
      _id: roleId,
      company_id: companyId,
      permissions: ['activate_dispatcher'],
    });

    const res = await supertest(server)
      .patch(`/api/v1/auth/user-activation/${userId}/rider`)
      .set(
        'Authorization',
        await logInUser({ role_id: roleId, company_id: companyId }),
      )
      .query({ action: 'deactivate' })
      .send();

    expect(res.status).toBe(201);
    expect(res.body).toMatchObject({
      success: true,
      message: 'User deactivated successfully',
    });
  });
});
