<!DOCTYPE html>
<!--
@license
Copyright (C) 2018 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<title>safe-types-behavior</title>
<script src="/test/common-test-setup.js"></script>
<script src="/bower_components/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../../test/common-test-setup.html"/>
<link rel="import" href="safe-types-behavior.html">

<script>void(0);</script>

<test-fixture id="basic">
  <template>
    <safe-types-element></safe-types-element>
  </template>
</test-fixture>

<script>
  suite('gr-tooltip-behavior tests', () => {
    let element;
    let sandbox;

    suiteSetup(() => {
      Polymer({
        is: 'safe-types-element',
        behaviors: [Gerrit.SafeTypes],
      });
    });

    setup(() => {
      sandbox = sinon.sandbox.create();
      element = fixture('basic');
    });

    teardown(() => {
      sandbox.restore();
    });

    test('SafeUrl accepts valid urls', () => {
      function accepts(url) {
        const safeUrl = new element.SafeUrl(url);
        assert.isOk(safeUrl);
        assert.equal(url, safeUrl.asString());
      }
      accepts('http://www.google.com/');
      accepts('https://www.google.com/');
      accepts('HtTpS://www.google.com/');
      accepts('//www.google.com/');
      accepts('/c/1234/file/path.html@45');
      accepts('#hash-url');
      accepts('mailto:name@example.com');
    });

    test('SafeUrl rejects invalid urls', () => {
      function rejects(url) {
        assert.throws(() => { new element.SafeUrl(url); });
      }
      rejects('javascript://alert("evil");');
      rejects('ftp:example.com');
      rejects('data:text/html,scary business');
    });

    suite('safeTypesBridge', () => {
      function acceptsString(value, type) {
        assert.equal(Gerrit.SafeTypes.safeTypesBridge(value, type),
            value);
      }

      function rejects(value, type) {
        assert.throws(() => { Gerrit.SafeTypes.safeTypesBridge(value, type); });
      }

      test('accepts valid URL strings', () => {
        acceptsString('/foo/bar', 'URL');
        acceptsString('#baz', 'URL');
      });

      test('rejects invalid URL strings', () => {
        rejects('javascript://void();', 'URL');
      });

      test('accepts SafeUrl values', () => {
        const url = '/abc/123';
        const safeUrl = new element.SafeUrl(url);
        assert.equal(Gerrit.SafeTypes.safeTypesBridge(safeUrl, 'URL'), url);
      });

      test('rejects non-string or non-SafeUrl types', () => {
        rejects(3.1415926, 'URL');
      });

      test('accepts any binding to STRING or CONSTANT', () => {
        acceptsString('foo/bar/baz', 'STRING');
        acceptsString('lorem ipsum dolor', 'CONSTANT');
      });

      test('rejects all other types', () => {
        rejects('foo', 'JAVASCRIPT');
        rejects('foo', 'HTML');
        rejects('foo', 'RESOURCE_URL');
        rejects('foo', 'STYLE');
      });
    });
  });
</script>
