/*
 *    (c) Copyright 2015 Hewlett-Packard Development Company, L.P.
 *
 * 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.
 */
(function () {
  'use strict';

  describe('LaunchInstanceModalService tests', function() {
    var service, modal, $window;

    beforeEach(module('horizon.dashboard.project'));
    beforeEach(module(function($provide) {
      modal = {
        open: function() {
          return {
            result: {
              then: angular.noop
            }
          };
        }
      };
      $window = { location: { href: '/' } };
      $provide.value('$uibModal', modal);
      $provide.value('$uibModalSpec', {});
      $provide.value('$window', $window);
    }));

    beforeEach(inject(function($injector) {
      service = $injector.get('horizon.dashboard.project.workflow.launch-instance.modal.service');
    }));

    describe('open function tests', function() {
      var func, launchContext;

      beforeEach(function() {
        func = service.open;
        launchContext = {};
      });

      it('calls modal.open', function() {
        spyOn(modal, 'open').and.returnValue({ result: { then: angular.noop } });
        func(launchContext);
        expect(modal.open).toHaveBeenCalled();
      });

      it('calls modal.open with expected values', function() {
        spyOn(modal, 'open').and.returnValue({ result: { then: angular.noop } });
        launchContext = { info: 'information' };
        func(launchContext);

        var resolve = modal.open.calls.argsFor(0)[0].resolve;
        expect(resolve).toBeDefined();
        expect(resolve.launchContext).toBeDefined();
        expect(resolve.launchContext()).toEqual({ info: 'information' });
      });

      it('sets up the correct success and failure paths', function() {
        var successFunc, errFunc;

        launchContext = { successUrl: '/good/path', dismissUrl: '/bad/path' };
        spyOn(modal, 'open').and
          .returnValue({
            result: {
              then: function(x, y) {
                successFunc = x;
                errFunc = y;
              }
            }
          });
        func(launchContext);
        successFunc('successUrl');
        expect($window.location.href).toBe('/good/path');
        errFunc('dismissUrl');
        expect($window.location.href).toBe('/bad/path');
      });

      it("doesn't redirect if not configured to", function() {
        var successFunc, errFunc;
        launchContext = {};
        spyOn(modal, 'open').and
          .returnValue({
            result: {
              then: function(x, y) {
                successFunc = x;
                errFunc = y;
              }
            }
          });
        func(launchContext);
        successFunc('successUrl');
        expect($window.location.href).toBe('/');
        errFunc('dismissUrl');
        expect($window.location.href).toBe('/');
      });
    });
  });

})();
