<!DOCTYPE html>
<!--
@license
Copyright (C) 2016 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-editable-content</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../../../test/common-test-setup.html"/>
<script src="../../../bower_components/iron-test-helpers/mock-interactions.js"></script>

<link rel="import" href="gr-editable-content.html">

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

<test-fixture id="basic">
  <template>
    <gr-editable-content></gr-editable-content>
  </template>
</test-fixture>

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

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

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

    test('save event', done => {
      element._newContent = 'foo';
      element.addEventListener('editable-content-save', e => {
        assert.equal(e.detail.content, 'foo');
        done();
      });
      MockInteractions.tap(element.$$('gr-button[primary]'));
    });

    test('cancel event', done => {
      element.addEventListener('editable-content-cancel', () => {
        done();
      });
      MockInteractions.tap(element.$$('gr-button:not([primary])'));
    });

    test('enabling editing updates edit field contents', () => {
      element.content = 'current content';
      element._newContent = 'stale content';
      element.editing = true;
      assert.equal(element._newContent, 'current content');
    });

    test('disabling editing does not update edit field contents', () => {
      element.content = 'current content';
      element.editing = true;
      element._newContent = 'stale content';
      element.editing = false;
      assert.equal(element._newContent, 'stale content');
    });

    test('zero width spaces are removed properly', () => {
      element.removeZeroWidthSpace = true;
      element.content = 'R=\u200Btest@google.com';
      element.editing = true;
      assert.equal(element._newContent, 'R=test@google.com');
    });

    suite('editing', () => {
      setup(() => {
        element.content = 'current content';
        element.editing = true;
      });

      test('save button is disabled initially', () => {
        assert.isTrue(element.$$('gr-button[primary]').disabled);
      });

      test('save button is enabled when content changes', () => {
        element._newContent = 'new content';
        assert.isFalse(element.$$('gr-button[primary]').disabled);
      });
    });

    suite('storageKey and related behavior', () => {
      let dispatchSpy;
      setup(() => {
        element.content = 'current content';
        element.storageKey = 'test';
        dispatchSpy = sandbox.spy(element, 'dispatchEvent');
      });

      test('editing toggled to true, has stored data', () => {
        sandbox.stub(element.$.storage, 'getEditableContentItem')
            .returns({message: 'stored content'});
        element.editing = true;

        assert.equal(element._newContent, 'stored content');
        assert.isTrue(dispatchSpy.called);
        assert.equal(dispatchSpy.lastCall.args[0].type, 'show-alert');
      });

      test('editing toggled to true, has no stored data', () => {
        sandbox.stub(element.$.storage, 'getEditableContentItem')
            .returns({});
        element.editing = true;

        assert.equal(element._newContent, 'current content');
        assert.isFalse(dispatchSpy.called);
      });

      test('edits are cached', () => {
        const storeStub =
            sandbox.stub(element.$.storage, 'setEditableContentItem');
        const eraseStub =
            sandbox.stub(element.$.storage, 'eraseEditableContentItem');
        element.editing = true;

        element._newContent = 'new content';
        flushAsynchronousOperations();
        element.flushDebouncer('store');

        assert.isTrue(storeStub.called);
        assert.deepEqual(
            [element.storageKey, element._newContent],
            storeStub.lastCall.args);

        element._newContent = '';
        flushAsynchronousOperations();
        element.flushDebouncer('store');

        assert.isTrue(eraseStub.called);
        assert.deepEqual([element.storageKey], eraseStub.lastCall.args);
      });
    });
  });
</script>
