import createBlink from '../main';
import { VERSION } from '../config/config';
import jest from 'jest-mock';

describe('PageLoad intregration test', () => {
  it('should send a single pageLoad event', () => {
    const mockSend = jest.fn();
    const blink = createBlink({
      send: mockSend,
      sendDirect: mockSend,
    });

    blink.pageInit({
      url: 'https://www.dagbladet.no/a/2313',
      pageType: '',
      pageView: 'new-pageview',
      previousPageView: 'prev-pv',
      referrer: 'www.sol.no',
      abCookie: 102,
      commercialSegments: 'sport,soccer,gardening',
      site: 'www.kk.no',
    });
    blink.pageLoad({
      url: 'https://www.dagbladet.no/a/2313',
      plussData: { hasAccess: true, customerNumber: '442' },
      clientHeight: 800,
      clientWidth: 600,
      scrollHeight: 1800,
    });

    expect(mockSend.mock.calls[0][0]).toEqual([
      {
        id: 'dagbladet.no/2313',
        type: 'pageLoad',
        abCookie: 102,
        commercialSegments: 'sport,soccer,gardening',
        article: {
          harvesterId: 'dagbladet.no/2313',
          url: 'https://www.dagbladet.no/a/2313',
        },
        pageType: '',
        pageView: 'new-pageview',
        previousPageView: 'prev-pv',
        plussData: {
          hasAccess: true,
          customerNumber: '442',
        },
        referrer: 'www.sol.no',
        site: 'www.kk.no',
        scroll: {
          scrollHeight: 1800,
        },
        version: VERSION,
        clientWidth: 600,
        clientHeight: 800,
      },
    ]);
  });

  it('should update the pageview, and flush the store', () => {
    const mockSend = jest.fn();
    const blink = createBlink({
      send: mockSend,
      sendDirect: mockSend,
    });

    blink.pageInit({
      url: 'https://www.dagbladet.no/a/2313',
      pageView: 'first-pageview',
      referrer: 'www.sol.no',
      site: 'www.dagbladet.no',
    });
    blink.pageLoad({
      url: 'https://www.dagbladet.no/a/2313',
      clientHeight: 550,
      clientWidth: 240,
      scrollHeight: 9001,
      plussData: { hasAccess: true, customerNumber: '442' },
    });

    // Do lots of events related to ads, activeTime and impressions
    blink.adScreenEnter({ id: 'top-banner', time: new Date(1) });
    blink.pageActivityStart({
      url: 'https://www.dagbladet.no/a/2313',
      pageScrollOffsetY: 340,
      time: new Date(2),
    });
    blink.articlePreviewScreenEnter({
      url: 'https://www.dinside.no/motor/kul-bil/49234',
      time: new Date(3),
      title: 'Kul bil',
    });

    // Register a _new_ pageInit, mid session
    blink.pageInit({
      url: 'https://www.dagbladet.no/a/2313',
      pageView: 'second-pageview',
      site: 'www.dagbladet.no',
    });
    blink.pageLoad({
      url: 'https://www.dagbladet.no/a/2313',
      plussData: {
        hasAccess: false,
        customerNumber: '',
      },
      clientHeight: 550,
      clientWidth: 240,
      scrollHeight: 9001,
    });

    const prevSentEvents = mockSend.mock.calls.length;
    // Send all events
    blink.sendAllEvents(new Date(10));

    // Check that nothing is actually sent
    expect(mockSend.mock.calls.length).toBe(prevSentEvents);
  });

  it('should create a new pageView for each pageInit, and update previous pageview', () => {
    const mockSend = jest.fn();
    const blink = createBlink({
      send: mockSend,
      sendDirect: mockSend,
    });

    blink.pageInit({
      url: 'https://www.dagbladet.no/',
      referrer: 'www.sol.no',
      site: 'www.dagbladet.no',
    });

    const frontPage1 = blink.getPage({ url: 'https://www.dagbladet.no/' });
    expect(frontPage1.pageView.length).toBe(36);

    blink.pageInit({
      url: 'https://www.dagbladet.no/a/2313',
      referrer: 'https://www.dagbladet.no/',
      site: 'www.dagbladet.no',
    });

    const articlePage = blink.getPage({
      url: 'https://www.dagbladet.no/a/2313',
    });
    expect(articlePage.pageView.length).toBe(36);
    expect(articlePage.pageView).not.toEqual(frontPage1.pageView);
    expect(articlePage.previousPageView).toEqual(frontPage1.pageView);

    blink.pageInit({
      url: 'https://www.dagbladet.no/',
      referrer: 'https://www.dagbladet.no/a/2313',
      site: 'www.dagbladet.no',
    });

    const frontPage2 = blink.getPage({ url: 'https://www.dagbladet.no/' });
    expect(frontPage2.pageView.length).toBe(36);
    expect(frontPage2.pageView).not.toEqual(articlePage.pageView);
    expect(frontPage2.pageView).not.toEqual(frontPage1.pageView);
    expect(frontPage2.previousPageView).toEqual(articlePage.pageView);
  });

  it('should send a separate pageLoad events for two separate pages', () => {
    enum PAGES {
      FIRST = 'FIRST_PAGE',
      SECOND = 'SECOND_PAGE',
    }
    const mockSend = jest.fn();
    const blink = createBlink({
      send: mockSend,
      sendDirect: mockSend,
    });

    // Init first page
    blink.pageInit({
      pageId: PAGES.FIRST,
      url: 'https://www.dagbladet.no/a/2313',
      pageType: '',
      pageView: `${PAGES.FIRST}-pageview`,
      previousPageView: 'prev-pv',
      referrer: 'www.sol.no',
      abCookie: 1,
      commercialSegments: 'sport,soccer,gardening',
      site: 'www.kk.no',
    });

    // Second page
    blink.pageInit({
      pageId: PAGES.SECOND,
      url: 'https://www.kk.no/a/123',
      pageType: '',
      pageView: `${PAGES.SECOND}-pageview`,
      previousPageView: 'prev-pv',
      referrer: 'www.kk.no',
      abCookie: 2,
      commercialSegments: 'sport,soccer,gardening',
      site: 'www.kk.no',
    });

    // Load first page
    blink.pageLoad({
      pageId: PAGES.FIRST,
      url: 'https://www.dagbladet.no/a/2313',
      clientHeight: 550,
      clientWidth: 240,
      scrollHeight: 9001,
      plussData: {
        hasAccess: true,
        customerNumber: '442',
      },
    });

    // Load second page
    blink.pageLoad({
      pageId: PAGES.SECOND,
      url: 'https://www.kk.no/a/123',
      clientHeight: 550,
      clientWidth: 240,
      scrollHeight: 9001,
      plussData: {
        hasAccess: false,
        customerNumber: '1234032042',
      },
    });

    expect(mockSend.mock.calls).toEqual([
      [
        [
          {
            id: 'dagbladet.no/2313',
            type: 'pageLoad',
            abCookie: 1,
            commercialSegments: 'sport,soccer,gardening',
            article: {
              harvesterId: 'dagbladet.no/2313',
              url: 'https://www.dagbladet.no/a/2313',
            },
            pageType: '',
            pageView: `${PAGES.FIRST}-pageview`,
            previousPageView: 'prev-pv',
            plussData: {
              hasAccess: true,
              customerNumber: '442',
            },
            referrer: 'www.sol.no',
            site: 'www.kk.no',
            scroll: {
              scrollHeight: 9001,
            },
            version: VERSION,
            clientWidth: 240,
            clientHeight: 550,
          },
        ],
      ],
      [
        [
          {
            id: 'kk.no/123',
            type: 'pageLoad',
            abCookie: 2,
            commercialSegments: 'sport,soccer,gardening',
            article: {
              harvesterId: 'kk.no/123',
              url: 'https://www.kk.no/a/123',
            },
            pageType: '',
            pageView: `${PAGES.SECOND}-pageview`,
            previousPageView: 'prev-pv',
            plussData: {
              hasAccess: false,
              customerNumber: '1234032042',
            },
            referrer: 'www.kk.no',
            site: 'www.kk.no',
            scroll: {
              scrollHeight: 9001,
            },
            version: VERSION,
            clientWidth: 240,
            clientHeight: 550,
          },
        ],
      ],
    ]);
  });
});
