/* global describe it expect beforeEach afterEach spyOn */

var $ = window.jQuery

describe('GOVUK.analyticsPlugins.externalLinkTracker', function () {

'use strict'
var GOVUK = window.GOVUK

var $links

beforeEach(function () {
  $links = $(
    '<div class="external-links">' +
      '<a href="http://www.nationalarchives.gov.uk"> National Archives </a>' +
      '<a href="https://www.nationalarchives.gov.uk"></a>' +
      '<a href="https://www.nationalarchives.gov.uk/one.pdf">National Archives PDF</a>' +
      '<a href="https://www.nationalarchives.gov.uk/an/image/link.png"><img src="/img" /></a>' +
    '</div>' +
    '<div class="internal-links">' +
      '<a href="/some-path">Local link</a>' +
      '<a href="http://fake-hostname.com/some-path">Another local link</a>' +
    '</div>'
  )

  $('html').on('click', function (evt) { evt.preventDefault() })
  $('body').append($links)
  GOVUK.analytics = {
    trackEvent: function () {},
    setDimension: function () {}
  }

  spyOn(GOVUK.analyticsPlugins.externalLinkTracker, 'getHostname').and.returnValue('fake-hostname.com')
})

afterEach(function () {
  $('html').off()
  $('body').off()
  $links.remove()
  delete GOVUK.analytics
})

it('listens to click events on only external links', function () {
  GOVUK.analyticsPlugins.externalLinkTracker({externalLinkUploadCustomDimension: 36})

  spyOn(GOVUK.analytics, 'trackEvent')

  $('.external-links a').each(function () {
    $(this).trigger('click')
    expect(GOVUK.analytics.trackEvent).toHaveBeenCalled()
    GOVUK.analytics.trackEvent.calls.reset()
  })

  $('.internal-links a').each(function () {
    $(this).trigger('click')
    expect(GOVUK.analytics.trackEvent).not.toHaveBeenCalled()
    GOVUK.analytics.trackEvent.calls.reset()
  })
})

it('listens to click events on elements within external links', function () {
  GOVUK.analyticsPlugins.externalLinkTracker({externalLinkUploadCustomDimension: 36})

  spyOn(GOVUK.analytics, 'trackEvent')

  $('.external-links a img').trigger('click')
  expect(GOVUK.analytics.trackEvent).toHaveBeenCalledWith(
    'External Link Clicked', 'https://www.nationalarchives.gov.uk/an/image/link.png', {transport: 'beacon'})
})

it('tracks an external link\'s href and link text', function () {
  GOVUK.analyticsPlugins.externalLinkTracker({externalLinkUploadCustomDimension: 36})

  spyOn(GOVUK.analytics, 'trackEvent')
  $('.external-links a').trigger('click')

  expect(GOVUK.analytics.trackEvent).toHaveBeenCalledWith(
    'External Link Clicked', 'http://www.nationalarchives.gov.uk', {transport: 'beacon', label: 'National Archives'})

  expect(GOVUK.analytics.trackEvent).toHaveBeenCalledWith(
    'External Link Clicked', 'https://www.nationalarchives.gov.uk', {transport: 'beacon'})

  expect(GOVUK.analytics.trackEvent).toHaveBeenCalledWith(
    'External Link Clicked', 'https://www.nationalarchives.gov.uk/one.pdf', {transport: 'beacon', label: 'National Archives PDF'})
})

it('duplicates the url info in a custom dimension to be used to join with a Google Analytics upload', function () {
  GOVUK.analyticsPlugins.externalLinkTracker({externalLinkUploadCustomDimension: 36})

  spyOn(GOVUK.analytics, 'setDimension')
  spyOn(GOVUK.analytics, 'trackEvent')
  $('.external-links a').trigger('click')

  expect(GOVUK.analytics.setDimension).toHaveBeenCalledWith(36, 'http://www.nationalarchives.gov.uk')
  expect(GOVUK.analytics.trackEvent).toHaveBeenCalledWith(
    'External Link Clicked', 'http://www.nationalarchives.gov.uk', {transport: 'beacon', label: 'National Archives'})
})

it('does not duplicate the url info if a custom dimension is not provided', function () {
  GOVUK.analyticsPlugins.externalLinkTracker()

  spyOn(GOVUK.analytics, 'setDimension')
  spyOn(GOVUK.analytics, 'trackEvent')
  $('.external-links a').trigger('click')

  expect(GOVUK.analytics.setDimension).not.toHaveBeenCalled()
  expect(GOVUK.analytics.trackEvent).toHaveBeenCalledWith(
    'External Link Clicked', 'http://www.nationalarchives.gov.uk', {transport: 'beacon', label: 'National Archives'})
})

})