all files / src/app/components/common/ Search.spec.js

100% Statements 73/73
100% Branches 0/0
100% Functions 20/20
100% Lines 73/73
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124            10× 10×   10×                                                                                        
import angular from 'angular';
import 'angular-ui-router';
import 'angular-mocks';
import {Search} from './Search';
import {NO_QUERY, GITHUB_ONLY, BAD_QUERY} from '../../utils/error.constants';
 
describe('Search component', () => {
  beforeEach(() => {
    angular.mock.module('ui.router');
    angular.module('search', ['ui.router'])
      .component('search', Search);
    angular.mock.module('search');
  });
 
  describe('Form functions', () => {
    let $scope;
    let $timeout;
    let element;
    let input;
    let component;
 
    beforeEach(() => {
      angular.mock.inject(($rootScope, $compile, $componentController, _$timeout_) => {
        $timeout = _$timeout_;
        $scope = $rootScope.$new();
        element = $compile('<search></search>')($scope);
        input = element.find('input');
        component = $componentController('search', {$scope, $timeout});
      });
    });
 
    it('should render correctly', () => {
      $scope.$digest();
      expect(input.attr('name')).toEqual('query');
      expect(input.attr('placeholder')).toEqual(component.placeholder);
      expect(input.val()).toEqual('');
      expect(component.error).toEqual({});
    });
 
    it('should populate example query', () => {
      expect(component.query).toEqual('');
      component.tryExample();
      expect(component.query).toEqual(component.example);
    });
 
    it('should focus cursor on input', () => {
      spyOn(component, 'focus');
      component.$onInit();
      $timeout.flush();
      $scope.$digest();
      expect(component.focus).toHaveBeenCalled();
    });
 
    it('should focus after example query', () => {
      spyOn(component, 'focus');
      expect(component.focus).not.toHaveBeenCalled();
      component.tryExample();
      expect(component.focus).toHaveBeenCalled();
    });
 
    it('should throw error correctly', () => {
      expect(component.error).toEqual({});
      const obj = {message: 'Bad move'};
      component.throwError(obj.message);
      expect(component.error).toEqual(obj);
    });
  });
 
  describe('Search function', () => {
    let $scope;
    let $state;
    let component;
 
    beforeEach(() => {
      angular.mock.inject(($rootScope, $compile, $componentController) => {
        $scope = $rootScope.$new();
        component = $componentController('search', {$scope});
      });
    });
 
    beforeEach(() => {
      angular.mock.inject(_$state_ => {
        $state = _$state_;
        spyOn($state, 'go');
      });
    });
 
    it('should throw error if no query', () => {
      spyOn(component, 'throwError');
      expect(component.throwError).not.toHaveBeenCalled();
      component.search('');
      expect(component.throwError).toHaveBeenCalledWith(NO_QUERY);
      expect($state.go).not.toHaveBeenCalled();
    });
 
    it('should accept github urls', () => {
      component.search('https://github.com/foo/bar');
      $scope.$digest();
      expect($state.go).toHaveBeenCalledWith('repos', {repo: 'foo::bar'});
    });
 
    it('should deny non-github urls', () => {
      spyOn(component, 'throwError');
      expect(component.throwError).not.toHaveBeenCalled();
      component.search('http://example.com/foo/bar');
      expect(component.throwError).toHaveBeenCalledWith(GITHUB_ONLY);
      expect($state.go).not.toHaveBeenCalled();
    });
 
    it('should accept "user/repo" query', () => {
      component.search('foo/bar');
      expect($state.go).toHaveBeenCalledWith('repos', {repo: 'foo::bar'});
    });
 
    it('should deny bad format in query', () => {
      spyOn(component, 'throwError');
      expect(component.throwError).not.toHaveBeenCalled();
      component.search('foobar');
      expect(component.throwError).toHaveBeenCalledWith(BAD_QUERY);
      expect($state.go).not.toHaveBeenCalled();
    });
  });
});