<!DOCTYPE html>
<!--
@license
Copyright (C) 2017 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-create-group-dialog</title>

<script src="/bower_components/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/bower_components/page/page.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="gr-create-group-dialog.html">

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

<test-fixture id="basic">
  <template>
    <gr-create-group-dialog></gr-create-group-dialog>
  </template>
</test-fixture>

<script>
  suite('gr-create-group-dialog tests', () => {
    let element;
    let sandbox;
    const GROUP_NAME = 'test-group';

    setup(() => {
      sandbox = sinon.sandbox.create();
      stub('gr-rest-api-interface', {
        getLoggedIn() { return Promise.resolve(true); },
      });
      element = fixture('basic');
    });

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

    test('name is updated correctly', done => {
      assert.isFalse(element.hasNewGroupName);

      const inputEl = element.root.querySelector('iron-input');
      inputEl.bindValue = GROUP_NAME;

      setTimeout(() => {
        assert.isTrue(element.hasNewGroupName);
        assert.deepEqual(element._name, GROUP_NAME);
        done();
      });
    });

    test('test for redirecting to group on successful creation', done => {
      sandbox.stub(element.$.restAPI, 'createGroup')
          .returns(Promise.resolve({status: 201}));

      sandbox.stub(element.$.restAPI, 'getGroupConfig')
          .returns(Promise.resolve({group_id: 551}));

      const showStub = sandbox.stub(page, 'show');
      element.handleCreateGroup()
          .then(() => {
            assert.isTrue(showStub.calledWith('/admin/groups/551'));
            done();
          });
    });

    test('test for unsuccessful group creation', done => {
      sandbox.stub(element.$.restAPI, 'createGroup')
          .returns(Promise.resolve({status: 409}));

      sandbox.stub(element.$.restAPI, 'getGroupConfig')
          .returns(Promise.resolve({group_id: 551}));

      const showStub = sandbox.stub(page, 'show');
      element.handleCreateGroup()
          .then(() => {
            assert.isFalse(showStub.called);
            done();
          });
    });
  });
</script>
