<!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-rule-editor</title>
<script src="/test/common-test-setup.js"></script>
<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-rule-editor.html">

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

<test-fixture id="basic">
  <template>
    <gr-rule-editor></gr-rule-editor>
  </template>
</test-fixture>

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

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

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

    suite('unit tests', () => {
      test('_computeForce, _computeForceClass, and _computeForceOptions',
          () => {
            const ForcePushOptions = {
              ALLOW: [
                {name: 'Allow pushing (but not force pushing)', value: false},
                {name: 'Allow pushing with or without force', value: true},
              ],
              BLOCK: [
                {name: 'Block pushing with or without force', value: false},
                {name: 'Block force pushing', value: true},
              ],
            };

            const FORCE_EDIT_OPTIONS = [
              {
                name: 'No Force Edit',
                value: false,
              },
              {
                name: 'Force Edit',
                value: true,
              },
            ];
            let permission = 'push';
            let action = 'ALLOW';
            assert.isTrue(element._computeForce(permission, action));
            assert.equal(element._computeForceClass(permission, action),
                'force');
            assert.deepEqual(element._computeForceOptions(permission, action),
                ForcePushOptions.ALLOW);

            action = 'BLOCK';
            assert.isTrue(element._computeForce(permission, action));
            assert.equal(element._computeForceClass(permission, action),
                'force');
            assert.deepEqual(element._computeForceOptions(permission, action),
                ForcePushOptions.BLOCK);

            action = 'DENY';
            assert.isFalse(element._computeForce(permission, action));
            assert.equal(element._computeForceClass(permission, action), '');
            assert.equal(
                element._computeForceOptions(permission, action).length, 0);

            permission = 'editTopicName';
            assert.isTrue(element._computeForce(permission));
            assert.equal(element._computeForceClass(permission), 'force');
            assert.deepEqual(element._computeForceOptions(permission),
                FORCE_EDIT_OPTIONS);
            permission = 'submit';
            assert.isFalse(element._computeForce(permission));
            assert.equal(element._computeForceClass(permission), '');
            assert.deepEqual(element._computeForceOptions(permission), []);
          });

      test('_computeSectionClass', () => {
        let deleted = true;
        let editing = false;
        assert.equal(element._computeSectionClass(editing, deleted), 'deleted');

        deleted = false;
        assert.equal(element._computeSectionClass(editing, deleted), '');

        editing = true;
        assert.equal(element._computeSectionClass(editing, deleted), 'editing');

        deleted = true;
        assert.equal(element._computeSectionClass(editing, deleted),
            'editing deleted');
      });

      test('_getDefaultRuleValues', () => {
        let permission = 'priority';
        let label;
        assert.deepEqual(element._getDefaultRuleValues(permission, label),
          {action: 'BATCH'});
        permission = 'label-Code-Review';
        label = {values: [
          {value: -2, text: 'This shall not be merged'},
          {value: -1, text: 'I would prefer this is not merged as is'},
          {value: -0, text: 'No score'},
          {value: 1, text: 'Looks good to me, but someone else must approve'},
          {value: 2, text: 'Looks good to me, approved'},
        ]};
        assert.deepEqual(element._getDefaultRuleValues(permission, label),
            {action: 'ALLOW', max: 2, min: -2});
        permission = 'push';
        label = undefined;
        assert.deepEqual(element._getDefaultRuleValues(permission, label),
          {action: 'ALLOW', force: false});
        permission = 'submit';
        assert.deepEqual(element._getDefaultRuleValues(permission, label),
            {action: 'ALLOW'});
      });

      test('_setDefaultRuleValues', () => {
        element.rule = {id: 123};
        const defaultValue = {action: 'ALLOW'};
        sandbox.stub(element, '_getDefaultRuleValues').returns(defaultValue);
        element._setDefaultRuleValues();
        assert.isTrue(element._getDefaultRuleValues.called);
        assert.equal(element.rule.value, defaultValue);
      });

      test('_computeOptions', () => {
        const PRIORITY_OPTIONS = [
          'BATCH',
          'INTERACTIVE',
        ];
        const DROPDOWN_OPTIONS = [
          'ALLOW',
          'DENY',
          'BLOCK',
        ];
        let permission = 'priority';
        assert.deepEqual(element._computeOptions(permission), PRIORITY_OPTIONS);
        permission = 'submit';
        assert.deepEqual(element._computeOptions(permission), DROPDOWN_OPTIONS);
      });

      test('_handleValueChange', () => {
        const modifiedHandler = sandbox.stub();
        element.rule = {value: {}};
        element.addEventListener('access-modified', modifiedHandler);
        element._handleValueChange();
        assert.isNotOk(element.rule.value.modified);
        element._originalRuleValues = {};
        element._handleValueChange();
        assert.isTrue(element.rule.value.modified);
        assert.isTrue(modifiedHandler.called);
      });

      test('_handleAccessSaved', () => {
        const originalValue = {action: 'DENY'};
        const newValue = {action: 'ALLOW'};
        element._originalRuleValues = originalValue;
        element.rule = {value: newValue};
        element._handleAccessSaved();
        assert.deepEqual(element._originalRuleValues, newValue);
      });

      test('_setOriginalRuleValues', () => {
        const value = {
          action: 'ALLOW',
          force: false,
        };
        element._setOriginalRuleValues(value);
        assert.deepEqual(element._originalRuleValues, value);
      });
    });

    suite('already existing generic rule', () => {
      setup(done => {
        element.group = 'Group Name';
        element.permission = 'submit';
        element.rule = {
          id: '123',
          value: {
            action: 'ALLOW',
            force: false,
          },
        };
        element.section = 'refs/*';

        // Typically called on ready since elements will have properies defined
        // by the parent element.
        element._setupValues(element.rule);
        flushAsynchronousOperations();
        flush(() => {
          element.attached();
          done();
        });
      });

      test('_ruleValues and _originalRuleValues are set correctly', () => {
        assert.deepEqual(element._originalRuleValues, element.rule.value);
      });

      test('values are set correctly', () => {
        assert.equal(element.$.action.bindValue, element.rule.value.action);
        assert.isNotOk(Polymer.dom(element.root).querySelector('#labelMin'));
        assert.isNotOk(Polymer.dom(element.root).querySelector('#labelMax'));
        assert.isFalse(element.$.force.classList.contains('force'));
      });

      test('modify and cancel restores original values', () => {
        element.editing = true;
        assert.notEqual(getComputedStyle(element.$.removeBtn).display, 'none');
        assert.isNotOk(element.rule.value.modified);
        element.$.action.bindValue = 'DENY';
        assert.isTrue(element.rule.value.modified);
        element.editing = false;
        assert.equal(getComputedStyle(element.$.removeBtn).display, 'none');
        assert.deepEqual(element._originalRuleValues, element.rule.value);
        assert.equal(element.$.action.bindValue, 'ALLOW');
        assert.isNotOk(element.rule.value.modified);
      });

      test('modify value', () => {
        assert.isNotOk(element.rule.value.modified);
        element.$.action.bindValue = 'DENY';
        flushAsynchronousOperations();
        assert.isTrue(element.rule.value.modified);

        // The original value should now differ from the rule values.
        assert.notDeepEqual(element._originalRuleValues, element.rule.value);
      });

      test('all selects are disabled when not in edit mode', () => {
        const selects = Polymer.dom(element.root).querySelectorAll('select');
        for (select of selects) {
          assert.isTrue(select.disabled);
        }
        element.editing = true;
        for (select of selects) {
          assert.isFalse(select.disabled);
        }
      });

      test('remove rule and undo remove', () => {
        element.editing = true;
        element.rule = {id: 123, value: {action: 'ALLOW'}};
        assert.isFalse(
            element.$.deletedContainer.classList.contains('deleted'));
        MockInteractions.tap(element.$.removeBtn);
        assert.isTrue(element.$.deletedContainer.classList.contains('deleted'));
        assert.isTrue(element._deleted);
        assert.isTrue(element.rule.value.deleted);

        MockInteractions.tap(element.$.undoRemoveBtn);
        assert.isFalse(element._deleted);
        assert.isNotOk(element.rule.value.deleted);
      });

      test('remove rule and cancel', () => {
        element.editing = true;
        assert.notEqual(getComputedStyle(element.$.removeBtn).display, 'none');
        assert.equal(getComputedStyle(element.$.deletedContainer).display,
            'none');

        element.rule = {id: 123, value: {action: 'ALLOW'}};
        MockInteractions.tap(element.$.removeBtn);
        assert.notEqual(getComputedStyle(element.$.removeBtn).display, 'none');
        assert.notEqual(getComputedStyle(element.$.deletedContainer).display,
            'none');
        assert.isTrue(element._deleted);
        assert.isTrue(element.rule.value.deleted);

        element.editing = false;
        assert.isFalse(element._deleted);
        assert.isNotOk(element.rule.value.deleted);
        assert.isNotOk(element.rule.value.modified);

        assert.deepEqual(element._originalRuleValues, element.rule.value);
        assert.equal(getComputedStyle(element.$.removeBtn).display, 'none');
        assert.equal(getComputedStyle(element.$.deletedContainer).display,
            'none');
      });

      test('_computeGroupPath', () => {
        const group = '123';
        assert.equal(element._computeGroupPath(group),
            `/admin/groups/123`);
      });
    });

    suite('new edit rule', () => {
      setup(done => {
        element.group = 'Group Name';
        element.permission = 'editTopicName';
        element.rule = {
          id: '123',
        };
        element.section = 'refs/*';
        element._setupValues(element.rule);
        flushAsynchronousOperations();
        element.rule.value.added = true;
        flush(() => {
          element.attached();
          done();
        });
      });

      test('_ruleValues and _originalRuleValues are set correctly', () => {
        // Since the element does not already have default values, they should
        // be set. The original values should be set to those too.
        assert.isNotOk(element.rule.value.modified);
        const expectedRuleValue = {
          action: 'ALLOW',
          force: false,
          added: true,
        };
        assert.deepEqual(element.rule.value, expectedRuleValue);
        test('values are set correctly', () => {
          assert.equal(element.$.action.bindValue, expectedRuleValue.action);
          assert.equal(element.$.force.bindValue, expectedRuleValue.action);
        });
      });

      test('modify value', () => {
        assert.isNotOk(element.rule.value.modified);
        element.$.force.bindValue = true;
        flushAsynchronousOperations();
        assert.isTrue(element.rule.value.modified);

        // The original value should now differ from the rule values.
        assert.notDeepEqual(element._originalRuleValues, element.rule.value);
      });

      test('remove value', () => {
        element.editing = true;
        const removeStub = sandbox.stub();
        element.addEventListener('added-rule-removed', removeStub);
        MockInteractions.tap(element.$.removeBtn);
        flushAsynchronousOperations();
        assert.isTrue(removeStub.called);
      });
    });

    suite('already existing rule with labels', () => {
      setup(done => {
        element.label = {values: [
          {value: -2, text: 'This shall not be merged'},
          {value: -1, text: 'I would prefer this is not merged as is'},
          {value: -0, text: 'No score'},
          {value: 1, text: 'Looks good to me, but someone else must approve'},
          {value: 2, text: 'Looks good to me, approved'},
        ]};
        element.group = 'Group Name';
        element.permission = 'label-Code-Review';
        element.rule = {
          id: '123',
          value: {
            action: 'ALLOW',
            force: false,
            max: 2,
            min: -2,
          },
        };
        element.section = 'refs/*';
        element._setupValues(element.rule);
        flushAsynchronousOperations();
        flush(() => {
          element.attached();
          done();
        });
      });

      test('_ruleValues and _originalRuleValues are set correctly', () => {
        assert.deepEqual(element._originalRuleValues, element.rule.value);
      });

      test('values are set correctly', () => {
        assert.equal(element.$.action.bindValue, element.rule.value.action);
        assert.equal(
            Polymer.dom(element.root).querySelector('#labelMin').bindValue,
            element.rule.value.min);
        assert.equal(
            Polymer.dom(element.root).querySelector('#labelMax').bindValue,
            element.rule.value.max);
        assert.isFalse(element.$.force.classList.contains('force'));
      });

      test('modify value', () => {
        const removeStub = sandbox.stub();
        element.addEventListener('added-rule-removed', removeStub);
        assert.isNotOk(element.rule.value.modified);
        Polymer.dom(element.root).querySelector('#labelMin').bindValue = 1;
        flushAsynchronousOperations();
        assert.isTrue(element.rule.value.modified);
        assert.isFalse(removeStub.called);

        // The original value should now differ from the rule values.
        assert.notDeepEqual(element._originalRuleValues, element.rule.value);
      });
    });

    suite('new rule with labels', () => {
      setup(done => {
        sandbox.spy(element, '_setDefaultRuleValues');
        element.label = {values: [
          {value: -2, text: 'This shall not be merged'},
          {value: -1, text: 'I would prefer this is not merged as is'},
          {value: -0, text: 'No score'},
          {value: 1, text: 'Looks good to me, but someone else must approve'},
          {value: 2, text: 'Looks good to me, approved'},
        ]};
        element.group = 'Group Name';
        element.permission = 'label-Code-Review';
        element.rule = {
          id: '123',
        };
        element.section = 'refs/*';
        element._setupValues(element.rule);
        flushAsynchronousOperations();
        element.rule.value.added = true;
        flush(() => {
          element.attached();
          done();
        });
      });

      test('_ruleValues and _originalRuleValues are set correctly', () => {
        // Since the element does not already have default values, they should
        // be set. The original values should be set to those too.
        assert.isNotOk(element.rule.value.modified);
        assert.isTrue(element._setDefaultRuleValues.called);

        const expectedRuleValue = {
          max: element.label.values[element.label.values.length - 1].value,
          min: element.label.values[0].value,
          action: 'ALLOW',
          added: true,
        };
        assert.deepEqual(element.rule.value, expectedRuleValue);
        test('values are set correctly', () => {
          assert.equal(
              element.$.action.bindValue,
              expectedRuleValue.action);
          assert.equal(
              Polymer.dom(element.root).querySelector('#labelMin').bindValue,
              expectedRuleValue.min);
          assert.equal(
              Polymer.dom(element.root).querySelector('#labelMax').bindValue,
              expectedRuleValue.max);
        });
      });

      test('modify value', () => {
        assert.isNotOk(element.rule.value.modified);
        Polymer.dom(element.root).querySelector('#labelMin').bindValue = 1;
        flushAsynchronousOperations();
        assert.isTrue(element.rule.value.modified);

        // The original value should now differ from the rule values.
        assert.notDeepEqual(element._originalRuleValues, element.rule.value);
      });
    });

    suite('already existing push rule', () => {
      setup(done => {
        element.group = 'Group Name';
        element.permission = 'push';
        element.rule = {
          id: '123',
          value: {
            action: 'ALLOW',
            force: true,
          },
        };
        element.section = 'refs/*';
        element._setupValues(element.rule);
        flushAsynchronousOperations();
        flush(() => {
          element.attached();
          done();
        });
      });

      test('_ruleValues and _originalRuleValues are set correctly', () => {
        assert.deepEqual(element._originalRuleValues, element.rule.value);
      });

      test('values are set correctly', () => {
        assert.isTrue(element.$.force.classList.contains('force'));
        assert.equal(element.$.action.bindValue, element.rule.value.action);
        assert.equal(
            Polymer.dom(element.root).querySelector('#force').bindValue,
            element.rule.value.force);
        assert.isNotOk(Polymer.dom(element.root).querySelector('#labelMin'));
        assert.isNotOk(Polymer.dom(element.root).querySelector('#labelMax'));
      });

      test('modify value', () => {
        assert.isNotOk(element.rule.value.modified);
        element.$.action.bindValue = false;
        flushAsynchronousOperations();
        assert.isTrue(element.rule.value.modified);

        // The original value should now differ from the rule values.
        assert.notDeepEqual(element._originalRuleValues, element.rule.value);
      });
    });

    suite('new push rule', () => {
      setup(done => {
        element.group = 'Group Name';
        element.permission = 'push';
        element.rule = {
          id: '123',
        };
        element.section = 'refs/*';
        element._setupValues(element.rule);
        flushAsynchronousOperations();
        element.rule.value.added = true;
        flush(() => {
          element.attached();
          done();
        });
      });

      test('_ruleValues and _originalRuleValues are set correctly', () => {
        // Since the element does not already have default values, they should
        // be set. The original values should be set to those too.
        assert.isNotOk(element.rule.value.modified);
        const expectedRuleValue = {
          action: 'ALLOW',
          force: false,
          added: true,
        };
        assert.deepEqual(element.rule.value, expectedRuleValue);
        test('values are set correctly', () => {
          assert.equal(element.$.action.bindValue, expectedRuleValue.action);
          assert.equal(element.$.force.bindValue, expectedRuleValue.action);
        });
      });

      test('modify value', () => {
        assert.isNotOk(element.rule.value.modified);
        element.$.force.bindValue = true;
        flushAsynchronousOperations();
        assert.isTrue(element.rule.value.modified);

        // The original value should now differ from the rule values.
        assert.notDeepEqual(element._originalRuleValues, element.rule.value);
      });
    });

    suite('already existing edit rule', () => {
      setup(done => {
        element.group = 'Group Name';
        element.permission = 'editTopicName';
        element.rule = {
          id: '123',
          value: {
            action: 'ALLOW',
            force: true,
          },
        };
        element.section = 'refs/*';
        element._setupValues(element.rule);
        flushAsynchronousOperations();
        flush(() => {
          element.attached();
          done();
        });
      });

      test('_ruleValues and _originalRuleValues are set correctly', () => {
        assert.deepEqual(element._originalRuleValues, element.rule.value);
      });

      test('values are set correctly', () => {
        assert.isTrue(element.$.force.classList.contains('force'));
        assert.equal(element.$.action.bindValue, element.rule.value.action);
        assert.equal(
            Polymer.dom(element.root).querySelector('#force').bindValue,
            element.rule.value.force);
        assert.isNotOk(Polymer.dom(element.root).querySelector('#labelMin'));
        assert.isNotOk(Polymer.dom(element.root).querySelector('#labelMax'));
      });

      test('modify value', () => {
        assert.isNotOk(element.rule.value.modified);
        element.$.action.bindValue = false;
        flushAsynchronousOperations();
        assert.isTrue(element.rule.value.modified);

        // The original value should now differ from the rule values.
        assert.notDeepEqual(element._originalRuleValues, element.rule.value);
      });
    });
  });
</script>
