7ca57c59c8
* master: (63 commits) Use `add_$role` helper in snippets specs removes old css class from everywhere Fixes broken build: Use jquery to get the element position in the page Check public snippets for spam Keep snippet visibility on error Update pipeline and commit URL and text on CI status change Support non-ASCII characters in GFM autocomplete Active tense test coverage Fix filtered search manager spec teaspoon error Reduce the number of loops that Cycle Analytics specs use Remove unnecessary returns / unset variables from the CoffeeScript -> JS conversion. update spec Change the reply shortcut to focus the field even without a selection. use destroy_all Remove settings cog from within admin scroll tabs; keep links centered add changelog remove old project members from project add spec replicating validation error Improve styling of the new issue message Don't capitalize environment name in show page ...
232 lines
10 KiB
JavaScript
232 lines
10 KiB
JavaScript
/* 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, max-len */
|
|
/* global AwardsHandler */
|
|
|
|
require('~/awards_handler');
|
|
require('./fixtures/emoji_menu');
|
|
|
|
(function() {
|
|
var awardsHandler, lazyAssert, urlRoot;
|
|
|
|
awardsHandler = null;
|
|
|
|
window.gl || (window.gl = {});
|
|
|
|
window.gon || (window.gon = {});
|
|
|
|
gl.emojiAliases = function() {
|
|
return {
|
|
'+1': 'thumbsup',
|
|
'-1': 'thumbsdown'
|
|
};
|
|
};
|
|
|
|
gon.award_menu_url = '/emojis';
|
|
urlRoot = gon.relative_url_root;
|
|
|
|
lazyAssert = function(done, assertFn) {
|
|
return setTimeout(function() {
|
|
assertFn();
|
|
return done();
|
|
// Maybe jasmine.clock here?
|
|
}, 333);
|
|
};
|
|
|
|
describe('AwardsHandler', function() {
|
|
preloadFixtures('issues/open-issue.html.raw');
|
|
beforeEach(function() {
|
|
loadFixtures('issues/open-issue.html.raw');
|
|
awardsHandler = new AwardsHandler;
|
|
spyOn(awardsHandler, 'postEmoji').and.callFake((function(_this) {
|
|
return function(url, emoji, cb) {
|
|
return cb();
|
|
};
|
|
})(this));
|
|
spyOn(jQuery, 'get').and.callFake(function(req, cb) {
|
|
return cb(window.emojiMenu);
|
|
});
|
|
});
|
|
afterEach(function() {
|
|
// restore original url root value
|
|
gon.relative_url_root = urlRoot;
|
|
});
|
|
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('returns the url for request', function() {
|
|
return expect(awardsHandler.getAwardUrl()).toBe('http://test.host/frontend-fixtures/issues-project/issues/1/toggle_award_emoji');
|
|
});
|
|
});
|
|
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);
|
|
});
|
|
});
|
|
describe('::addYouToUserList', function() {
|
|
it('should prepend "You" to the award tooltip', function() {
|
|
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, jerry, max, and andy');
|
|
awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
|
|
$thumbsUpEmoji.tooltip();
|
|
return expect($thumbsUpEmoji.data("original-title")).toBe('You, sam, jerry, max, and andy');
|
|
});
|
|
return it('handles the special case where "You" is not cleanly comma seperated', function() {
|
|
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();
|
|
return expect($thumbsUpEmoji.data("original-title")).toBe('You and sam');
|
|
});
|
|
});
|
|
describe('::removeYouToUserList', function() {
|
|
it('removes "You" from the front of the tooltip', function() {
|
|
var $thumbsUpEmoji, $votesBlock, awardUrl;
|
|
awardUrl = awardsHandler.getAwardUrl();
|
|
$votesBlock = $('.js-awards-block').eq(0);
|
|
$thumbsUpEmoji = $votesBlock.find('[data-emoji=thumbsup]').parent();
|
|
$thumbsUpEmoji.attr('data-title', 'You, sam, jerry, max, and andy');
|
|
$thumbsUpEmoji.addClass('active');
|
|
awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
|
|
$thumbsUpEmoji.tooltip();
|
|
return expect($thumbsUpEmoji.data("original-title")).toBe('sam, jerry, max, and andy');
|
|
});
|
|
return it('handles the special case where "You" is not cleanly comma seperated', function() {
|
|
var $thumbsUpEmoji, $votesBlock, awardUrl;
|
|
awardUrl = awardsHandler.getAwardUrl();
|
|
$votesBlock = $('.js-awards-block').eq(0);
|
|
$thumbsUpEmoji = $votesBlock.find('[data-emoji=thumbsup]').parent();
|
|
$thumbsUpEmoji.attr('data-title', 'You and sam');
|
|
$thumbsUpEmoji.addClass('active');
|
|
awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
|
|
$thumbsUpEmoji.tooltip();
|
|
return expect($thumbsUpEmoji.data("original-title")).toBe('sam');
|
|
});
|
|
});
|
|
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');
|
|
$emoji = $menu.find('.emoji-menu-list:not(.frequent-emojis) ' + selector);
|
|
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');
|
|
$emoji = $('.emoji-menu').find(".emoji-menu-list:not(.frequent-emojis) " + selector);
|
|
$emoji.click();
|
|
return expect($block.find(selector).length).toBe(0);
|
|
});
|
|
});
|
|
});
|
|
}).call(this);
|