import { forEach, size } from 'lodash';

import { getProfilesFromResponse } from '../../src/repositories/profile.repository';
import { createMiniProfile } from './profile-factories';

export const createResponse = (count: number) => ({
  data: {
    elements: [],
  },
  included: createMiniProfile(count),
});

test('should pull mini profiles out of response', () => {
  const response = createResponse(10);
  const profiles = getProfilesFromResponse(response);

  expect(size(profiles)).toEqual(10);
  forEach(profiles, profile => {
    expect(Object.keys(profile).sort()).toEqual(Object.keys(Object.values(profiles)[0]).sort());
  });
});

test('should set profile id and key the returned object by it', () => {
  const response = createResponse(10);
  const profiles = getProfilesFromResponse(response);

  forEach(profiles, (profile, profileId) => {
    expect(profile.profileId).toEqual(profileId);
  });
});

test('should set empty picture urls if there is no picture', () => {
  const response = createResponse(1);

  response.included[0].picture = undefined;

  const profiles = getProfilesFromResponse(response);

  expect(Object.values(profiles)[0].pictureUrls).toEqual([]);
});

test('should populate picture urls on the profile', () => {
  const response = createResponse(1);

  const profiles = getProfilesFromResponse(response);
  const profile = Object.values(profiles)[0];

  const originalPicture = response.included[0].picture;

  expect(profile.pictureUrls.length).toEqual(4);
  profile.pictureUrls.forEach((url, index) => {
    expect(url).toEqual(`${originalPicture?.rootUrl}${originalPicture?.artifacts[index].fileIdentifyingUrlPathSegment}`);
  });
});

test('should return empty object if there are no profiles', () => {
  const response = createResponse(1);

  response.included = [];

  const profiles = getProfilesFromResponse(response);

  expect(profiles).toEqual({});
});