import { Profile } from './profile';
import { getScraper } from './test-utils';

test('scraper can get screen name by user id', async () => {
  const scraper = await getScraper();
  const screenName = await scraper.getScreenNameByUserId('1586562503865008129');
  expect(screenName).toEqual('ligma__sigma');
});

test('scraper can get profile', async () => {
  const expected: Profile = {
    avatar:
      'https://pbs.twimg.com/profile_images/436075027193004032/XlDa2oaz.jpeg',
    banner: 'https://pbs.twimg.com/profile_banners/106037940/1541084318',
    biography: 'nothing',
    isPrivate: false,
    isVerified: false,
    joined: new Date(Date.UTC(2010, 0, 18, 8, 49, 30, 0)),
    location: 'Ukraine',
    name: 'Nomadic',
    pinnedTweetIds: [],
    url: 'https://twitter.com/nomadic_ua',
    userId: '106037940',
    username: 'nomadic_ua',
    website: 'https://nomadic.name',
  };

  const scraper = await getScraper();

  const actual = await scraper.getProfile('nomadic_ua');
  expect(actual.avatar).toEqual(expected.avatar);
  expect(actual.banner).toEqual(expected.banner);
  expect(actual.biography).toEqual(expected.biography);
  expect(actual.isPrivate).toEqual(expected.isPrivate);
  expect(actual.isVerified).toEqual(expected.isVerified);
  expect(actual.joined).toEqual(expected.joined);
  expect(actual.location).toEqual(expected.location);
  expect(actual.name).toEqual(expected.name);
  expect(actual.pinnedTweetIds).toEqual(expected.pinnedTweetIds);
  expect(actual.url).toEqual(expected.url);
  expect(actual.userId).toEqual(expected.userId);
  expect(actual.username).toEqual(expected.username);
  expect(actual.website).toEqual(expected.website);
});

test('scraper can get partial private profile', async () => {
  const expected: Profile = {
    avatar:
      'https://pbs.twimg.com/profile_images/1612213936082030594/_HEsjv7Q.jpg',
    banner:
      'https://pbs.twimg.com/profile_banners/1221221876849995777/1673110776',
    biography: `t h e h e r m i t`,
    isPrivate: true,
    isVerified: false,
    joined: new Date(Date.UTC(2020, 0, 26, 0, 3, 5, 0)),
    location: 'sometimes',
    name: 'private account',
    pinnedTweetIds: [],
    url: 'https://twitter.com/tomdumont',
    userId: '1221221876849995777',
    username: 'tomdumont',
    website: undefined,
  };

  const scraper = await getScraper();

  const actual = await scraper.getProfile('tomdumont');
  expect(actual.avatar).toEqual(expected.avatar);
  expect(actual.banner).toEqual(expected.banner);
  expect(actual.biography).toEqual(expected.biography);
  expect(actual.isPrivate).toEqual(expected.isPrivate);
  expect(actual.isVerified).toEqual(expected.isVerified);
  expect(actual.joined).toEqual(expected.joined);
  expect(actual.location).toEqual(expected.location);
  expect(actual.name).toEqual(expected.name);
  expect(actual.pinnedTweetIds).toEqual(expected.pinnedTweetIds);
  expect(actual.url).toEqual(expected.url);
  expect(actual.userId).toEqual(expected.userId);
  expect(actual.username).toEqual(expected.username);
  expect(actual.website).toEqual(expected.website);
});

test('scraper cannot get suspended profile', async () => {
  const scraper = await getScraper();
  // taken from https://en.wikipedia.org/wiki/Twitter_suspensions#List_of_notable_suspensions
  expect(scraper.getProfile('RobertC20041800')).rejects.toThrow();
});

test('scraper cannot get not found profile', async () => {
  const scraper = await getScraper();
  expect(scraper.getProfile('sample3123131')).rejects.toThrow();
});

test('scraper can get profile by screen name', async () => {
  const scraper = await getScraper();
  await scraper.getProfile('Twitter');
});
