<!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.
-->

<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<title>gr-upload-help-dialog</title>

<script src="/node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/components/wct-browser-legacy/browser.js"></script>

<test-fixture id="basic">
  <template>
    <gr-upload-help-dialog></gr-upload-help-dialog>
  </template>
</test-fixture>

<script type="module">
import '../../../test/common-test-setup.js';
import './gr-upload-help-dialog.js';
suite('gr-upload-help-dialog tests', () => {
  let element;

  setup(() => {
    element = fixture('basic');
  });

  test('constructs push command from branch', () => {
    element.targetBranch = 'foo';
    assert.equal(element._pushCommand, 'git push origin HEAD:refs/for/foo');

    element.targetBranch = 'master';
    assert.equal(element._pushCommand,
        'git push origin HEAD:refs/for/master');
  });

  suite('fetch command', () => {
    const testRev = {
      fetch: {
        http: {
          commands: {
            Checkout: 'http checkout',
            Pull: 'http pull',
          },
        },
        ssh: {
          commands: {
            Pull: 'ssh pull',
          },
        },
      },
    };

    test('null cases', () => {
      assert.isUndefined(element._computeFetchCommand());
      assert.isUndefined(element._computeFetchCommand({}));
      assert.isUndefined(element._computeFetchCommand({fetch: null}));
      assert.isUndefined(element._computeFetchCommand({fetch: {}}));
    });

    test('not all defined', () => {
      assert.isUndefined(
          element._computeFetchCommand(testRev, undefined, ''));
      assert.isUndefined(
          element._computeFetchCommand(testRev, '', undefined));
      assert.isUndefined(
          element._computeFetchCommand(undefined, '', ''));
    });

    test('insufficiently defined scheme', () => {
      assert.isUndefined(
          element._computeFetchCommand(testRev, '', 'badscheme'));

      const rev = Object.assign({}, testRev);
      rev.fetch = Object.assign({}, testRev.fetch, {nocmds: {commands: {}}});
      assert.isUndefined(
          element._computeFetchCommand(rev, '', 'nocmds'));

      rev.fetch.nocmds.commands.unsupported = 'unsupported';
      assert.isUndefined(
          element._computeFetchCommand(rev, '', 'nocmds'));
    });

    test('default scheme and command', () => {
      const cmd = element._computeFetchCommand(testRev, '', '');
      assert.isTrue(cmd === 'http checkout' || cmd === 'ssh pull');
    });

    test('default command', () => {
      assert.strictEqual(
          element._computeFetchCommand(testRev, '', 'http'),
          'http checkout');
      assert.strictEqual(
          element._computeFetchCommand(testRev, '', 'ssh'),
          'ssh pull');
    });

    test('user preferred scheme and command', () => {
      assert.strictEqual(
          element._computeFetchCommand(testRev, 'PULL', 'http'),
          'http pull');
      assert.strictEqual(
          element._computeFetchCommand(testRev, 'badcmd', 'http'),
          'http checkout');
    });
  });
});
</script>
