import setWindowLocation from './set_window_location_helper';

describe('setWindowLocation', () => {
  const originalLocation = window.location;

  afterEach(() => {
    window.location = originalLocation;
  });

  it.each`
    url                                    | property      | value
    ${'https://gitlab.com#foo'}            | ${'hash'}     | ${'#foo'}
    ${'http://gitlab.com'}                 | ${'host'}     | ${'gitlab.com'}
    ${'http://gitlab.org'}                 | ${'hostname'} | ${'gitlab.org'}
    ${'http://gitlab.org/foo#bar'}         | ${'href'}     | ${'http://gitlab.org/foo#bar'}
    ${'http://gitlab.com'}                 | ${'origin'}   | ${'http://gitlab.com'}
    ${'http://gitlab.com/foo/bar/baz'}     | ${'pathname'} | ${'/foo/bar/baz'}
    ${'https://gitlab.com'}                | ${'protocol'} | ${'https:'}
    ${'http://gitlab.com#foo'}             | ${'protocol'} | ${'http:'}
    ${'http://gitlab.com:8080'}            | ${'port'}     | ${'8080'}
    ${'http://gitlab.com?foo=bar&bar=foo'} | ${'search'}   | ${'?foo=bar&bar=foo'}
  `(
    'sets "window.location.$property" to be "$value" when called with: "$url"',
    ({ url, property, value }) => {
      expect(window.location).toBe(originalLocation);

      setWindowLocation(url);

      expect(window.location[property]).toBe(value);
    },
  );

  it.each([null, 1, undefined, false, '', 'gitlab.com'])(
    'throws an error when called with an invalid url: "%s"',
    invalidUrl => {
      expect(() => setWindowLocation(invalidUrl)).toThrow(/Invalid URL/);
      expect(window.location).toBe(originalLocation);
    },
  );
});
