awards_handler_spec.js 10.1 KB
Newer Older
1 2
/* eslint-disable space-before-function-paren, no-var, one-var, one-var-declaration-per-line, no-unused-expressions, comma-dangle, new-parens, no-unused-vars, quotes, jasmine/no-spec-dupes, prefer-template, padded-blocks, max-len */
/* global AwardsHandler */
Fatih Acet's avatar
Fatih Acet committed
3 4 5

/*= require awards_handler */
/*= require jquery */
6
/*= require js.cookie */
Fatih Acet's avatar
Fatih Acet committed
7 8 9
/*= require ./fixtures/emoji_menu */

(function() {
10
  var awardsHandler, lazyAssert, urlRoot;
Fatih Acet's avatar
Fatih Acet committed
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

  awardsHandler = null;

  window.gl || (window.gl = {});

  window.gon || (window.gon = {});

  gl.emojiAliases = function() {
    return {
      '+1': 'thumbsup',
      '-1': 'thumbsdown'
    };
  };

  gon.award_menu_url = '/emojis';
26
  urlRoot = gon.relative_url_root;
Fatih Acet's avatar
Fatih Acet committed
27 28 29 30 31

  lazyAssert = function(done, assertFn) {
    return setTimeout(function() {
      assertFn();
      return done();
32
    // Maybe jasmine.clock here?
Fatih Acet's avatar
Fatih Acet committed
33 34 35 36
    }, 333);
  };

  describe('AwardsHandler', function() {
37
    fixture.preload('issues/open-issue.html.raw');
Fatih Acet's avatar
Fatih Acet committed
38
    beforeEach(function() {
39
      fixture.load('issues/open-issue.html.raw');
Fatih Acet's avatar
Fatih Acet committed
40 41 42 43 44 45
      awardsHandler = new AwardsHandler;
      spyOn(awardsHandler, 'postEmoji').and.callFake((function(_this) {
        return function(url, emoji, cb) {
          return cb();
        };
      })(this));
46
      spyOn(jQuery, 'get').and.callFake(function(req, cb) {
Fatih Acet's avatar
Fatih Acet committed
47 48
        return cb(window.emojiMenu);
      });
49 50 51 52
    });
    afterEach(function() {
      // restore original url root value
      gon.relative_url_root = urlRoot;
Fatih Acet's avatar
Fatih Acet committed
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
    });
    describe('::showEmojiMenu', function() {
      it('should show emoji menu when Add emoji button clicked', function(done) {
        $('.js-add-award').eq(0).click();
        return lazyAssert(done, function() {
          var $emojiMenu;
          $emojiMenu = $('.emoji-menu');
          expect($emojiMenu.length).toBe(1);
          expect($emojiMenu.hasClass('is-visible')).toBe(true);
          expect($emojiMenu.find('#emoji_search').length).toBe(1);
          return expect($('.js-awards-block.current').length).toBe(1);
        });
      });
      it('should also show emoji menu for the smiley icon in notes', function(done) {
        $('.note-action-button').click();
        return lazyAssert(done, function() {
          var $emojiMenu;
          $emojiMenu = $('.emoji-menu');
          return expect($emojiMenu.length).toBe(1);
        });
      });
      return it('should remove emoji menu when body is clicked', function(done) {
        $('.js-add-award').eq(0).click();
        return lazyAssert(done, function() {
          var $emojiMenu;
          $emojiMenu = $('.emoji-menu');
          $('body').click();
          expect($emojiMenu.length).toBe(1);
          expect($emojiMenu.hasClass('is-visible')).toBe(false);
          return expect($('.js-awards-block.current').length).toBe(0);
        });
      });
    });
    describe('::addAwardToEmojiBar', function() {
      it('should add emoji to votes block', function() {
        var $emojiButton, $votesBlock;
        $votesBlock = $('.js-awards-block').eq(0);
        awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
        $emojiButton = $votesBlock.find('[data-emoji=heart]');
        expect($emojiButton.length).toBe(1);
        expect($emojiButton.next('.js-counter').text()).toBe('1');
        return expect($votesBlock.hasClass('hidden')).toBe(false);
      });
      it('should remove the emoji when we click again', function() {
        var $emojiButton, $votesBlock;
        $votesBlock = $('.js-awards-block').eq(0);
        awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
        awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
        $emojiButton = $votesBlock.find('[data-emoji=heart]');
        return expect($emojiButton.length).toBe(0);
      });
      return it('should decrement the emoji counter', function() {
        var $emojiButton, $votesBlock;
        $votesBlock = $('.js-awards-block').eq(0);
        awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
        $emojiButton = $votesBlock.find('[data-emoji=heart]');
        $emojiButton.next('.js-counter').text(5);
        awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
        expect($emojiButton.length).toBe(1);
        return expect($emojiButton.next('.js-counter').text()).toBe('4');
      });
    });
    describe('::getAwardUrl', function() {
      return it('should return the url for request', function() {
117
        return expect(awardsHandler.getAwardUrl()).toBe('http://test.host/frontend-fixtures/issues-project/issues/1/toggle_award_emoji');
Fatih Acet's avatar
Fatih Acet committed
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
      });
    });
    describe('::addAward and ::checkMutuality', function() {
      return it('should handle :+1: and :-1: mutuality', function() {
        var $thumbsDownEmoji, $thumbsUpEmoji, $votesBlock, awardUrl;
        awardUrl = awardsHandler.getAwardUrl();
        $votesBlock = $('.js-awards-block').eq(0);
        $thumbsUpEmoji = $votesBlock.find('[data-emoji=thumbsup]').parent();
        $thumbsDownEmoji = $votesBlock.find('[data-emoji=thumbsdown]').parent();
        awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
        expect($thumbsUpEmoji.hasClass('active')).toBe(true);
        expect($thumbsDownEmoji.hasClass('active')).toBe(false);
        $thumbsUpEmoji.tooltip();
        $thumbsDownEmoji.tooltip();
        awardsHandler.addAward($votesBlock, awardUrl, 'thumbsdown', true);
        expect($thumbsUpEmoji.hasClass('active')).toBe(false);
        return expect($thumbsDownEmoji.hasClass('active')).toBe(true);
      });
    });
    describe('::removeEmoji', function() {
      return it('should remove emoji', function() {
        var $votesBlock, awardUrl;
        awardUrl = awardsHandler.getAwardUrl();
        $votesBlock = $('.js-awards-block').eq(0);
        awardsHandler.addAward($votesBlock, awardUrl, 'fire', false);
        expect($votesBlock.find('[data-emoji=fire]').length).toBe(1);
        awardsHandler.removeEmoji($votesBlock.find('[data-emoji=fire]').closest('button'));
        return expect($votesBlock.find('[data-emoji=fire]').length).toBe(0);
      });
    });
148 149
    describe('::addYouToUserList', function() {
      it('should prepend "You" to the award tooltip', function() {
150 151 152 153
        var $thumbsUpEmoji, $votesBlock, awardUrl;
        awardUrl = awardsHandler.getAwardUrl();
        $votesBlock = $('.js-awards-block').eq(0);
        $thumbsUpEmoji = $votesBlock.find('[data-emoji=thumbsup]').parent();
154
        $thumbsUpEmoji.attr('data-title', 'sam, jerry, max, and andy');
155 156
        awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
        $thumbsUpEmoji.tooltip();
157
        return expect($thumbsUpEmoji.data("original-title")).toBe('You, sam, jerry, max, and andy');
158
      });
159
      return it('handles the special case where "You" is not cleanly comma seperated', function() {
160 161 162 163 164 165 166
        var $thumbsUpEmoji, $votesBlock, awardUrl;
        awardUrl = awardsHandler.getAwardUrl();
        $votesBlock = $('.js-awards-block').eq(0);
        $thumbsUpEmoji = $votesBlock.find('[data-emoji=thumbsup]').parent();
        $thumbsUpEmoji.attr('data-title', 'sam');
        awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
        $thumbsUpEmoji.tooltip();
167
        return expect($thumbsUpEmoji.data("original-title")).toBe('You and sam');
168 169
      });
    });
170 171
    describe('::removeYouToUserList', function() {
      it('removes "You" from the front of the tooltip', function() {
172 173 174 175
        var $thumbsUpEmoji, $votesBlock, awardUrl;
        awardUrl = awardsHandler.getAwardUrl();
        $votesBlock = $('.js-awards-block').eq(0);
        $thumbsUpEmoji = $votesBlock.find('[data-emoji=thumbsup]').parent();
176
        $thumbsUpEmoji.attr('data-title', 'You, sam, jerry, max, and andy');
177 178 179 180 181
        $thumbsUpEmoji.addClass('active');
        awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
        $thumbsUpEmoji.tooltip();
        return expect($thumbsUpEmoji.data("original-title")).toBe('sam, jerry, max, and andy');
      });
182
      return it('handles the special case where "You" is not cleanly comma seperated', function() {
183 184 185 186
        var $thumbsUpEmoji, $votesBlock, awardUrl;
        awardUrl = awardsHandler.getAwardUrl();
        $votesBlock = $('.js-awards-block').eq(0);
        $thumbsUpEmoji = $votesBlock.find('[data-emoji=thumbsup]').parent();
187
        $thumbsUpEmoji.attr('data-title', 'You and sam');
188 189 190
        $thumbsUpEmoji.addClass('active');
        awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
        $thumbsUpEmoji.tooltip();
191
        return expect($thumbsUpEmoji.data("original-title")).toBe('sam');
192 193
      });
    });
Fatih Acet's avatar
Fatih Acet committed
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
    describe('search', function() {
      return it('should filter the emoji', function() {
        $('.js-add-award').eq(0).click();
        expect($('[data-emoji=angel]').is(':visible')).toBe(true);
        expect($('[data-emoji=anger]').is(':visible')).toBe(true);
        $('#emoji_search').val('ali').trigger('keyup');
        expect($('[data-emoji=angel]').is(':visible')).toBe(false);
        expect($('[data-emoji=anger]').is(':visible')).toBe(false);
        return expect($('[data-emoji=alien]').is(':visible')).toBe(true);
      });
    });
    return describe('emoji menu', function() {
      var openEmojiMenuAndAddEmoji, selector;
      selector = '[data-emoji=sunglasses]';
      openEmojiMenuAndAddEmoji = function() {
        var $block, $emoji, $menu;
        $('.js-add-award').eq(0).click();
        $menu = $('.emoji-menu');
        $block = $('.js-awards-block');
213
        $emoji = $menu.find('.emoji-menu-list:not(.frequent-emojis) ' + selector);
Fatih Acet's avatar
Fatih Acet committed
214 215 216 217 218 219 220 221 222 223 224 225 226 227
        expect($emoji.length).toBe(1);
        expect($block.find(selector).length).toBe(0);
        $emoji.click();
        expect($menu.hasClass('.is-visible')).toBe(false);
        return expect($block.find(selector).length).toBe(1);
      };
      it('should add selected emoji to awards block', function() {
        return openEmojiMenuAndAddEmoji();
      });
      return it('should remove already selected emoji', function() {
        var $block, $emoji;
        openEmojiMenuAndAddEmoji();
        $('.js-add-award').eq(0).click();
        $block = $('.js-awards-block');
228
        $emoji = $('.emoji-menu').find(".emoji-menu-list:not(.frequent-emojis) " + selector);
Fatih Acet's avatar
Fatih Acet committed
229 230 231 232 233 234 235
        $emoji.click();
        return expect($block.find(selector).length).toBe(0);
      });
    });
  });

}).call(this);