/*
 * SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file)
 *
 * SPDX-License-Identifier: AGPL-3.0-only
 */
import request from 'supertest';

import { GuestAccess } from '../../src/config/guest_access.enum';
import { createDefaultMockNoteConfig } from '../../src/config/mock/note.config.mock';
import { NoteConfig } from '../../src/config/note.config';
import { LoginDto } from '../../src/identity/local/login.dto';
import {
  password1,
  TestSetup,
  TestSetupBuilder,
  username1,
} from '../test-setup';

describe('Groups', () => {
  let testSetup: TestSetup;
  let testuser1Session: request.SuperAgentTest;
  const noteConfigMock: NoteConfig = createDefaultMockNoteConfig();

  beforeEach(async () => {
    testSetup = await TestSetupBuilder.create({
      noteConfigMock: noteConfigMock,
    })
      .withUsers()
      .build();
    await testSetup.app.init();

    // create a test group
    await testSetup.groupService.createGroup('testgroup1', 'testgroup1', false);

    // log in to create a session
    const loginDto: LoginDto = {
      password: password1,
      username: username1,
    };
    testuser1Session = request.agent(testSetup.app.getHttpServer());
    await testuser1Session
      .post('/api/private/auth/local/login')
      .set('Content-Type', 'application/json')
      .send(JSON.stringify(loginDto))
      .expect(201);
  });

  afterEach(async () => {
    await testSetup.app.close();
    await testSetup.cleanup();
  });

  test('details for existing groups can be retrieved', async () => {
    const response = await testuser1Session.get(
      '/api/private/groups/testgroup1',
    );
    expect(response.status).toBe(200);
    expect(response.body.name).toBe('testgroup1');
  });

  test('details for non-existing groups cannot be retrieved', async () => {
    const response = await testuser1Session.get(
      '/api/private/groups/i_dont_exist',
    );
    expect(response.status).toBe(404);
  });

  describe('API requires authentication', () => {
    beforeAll(() => {
      noteConfigMock.guestAccess = GuestAccess.DENY;
    });
    test('get group', async () => {
      const response = await request(testSetup.app.getHttpServer()).get(
        '/api/private/groups/testgroup1',
      );
      expect(response.status).toBe(401);
    });
  });
});