69e4072f89
* master: (389 commits)
Document "No gems fetched from git repositories" policy [ci skip]
Typos
Small gramatical tweaks
Typos
Added PHP & NPM doc
Use `:empty_project` where possible in request specs
Add caching of droplab ajax requests
Use `:empty_project` where possible in model specs
Revert 3f17f29a
Remove unused js response from refs controller
Add MR id to changelog entry
fixed small mini pipeline graph line glitch
Prevent form to be submitted twice
Fix Error 500 when repositories contain annotated tags pointing to blobs
Fix /explore sorting (trending)
Simplify wording in "adding an image" docs
Remove "official merge window" from CONTRIBUTING.md [ci skip]
Update repository check documentation
Fixed flexbox and wrap issues
Update two_factor_authentication.md
...
230 lines
8.3 KiB
JavaScript
230 lines
8.3 KiB
JavaScript
/* eslint-disable space-before-function-paren, no-var, no-param-reassign, quotes, prefer-template, no-else-return, new-cap, dot-notation, no-return-assign, comma-dangle, no-new, one-var, one-var-declaration-per-line, jasmine/no-spec-dupes, no-underscore-dangle, max-len */
|
|
/* global LineHighlighter */
|
|
|
|
require('~/line_highlighter');
|
|
|
|
(function() {
|
|
describe('LineHighlighter', function() {
|
|
var clickLine;
|
|
preloadFixtures('static/line_highlighter.html.raw');
|
|
clickLine = function(number, eventData) {
|
|
var e;
|
|
if (eventData == null) {
|
|
eventData = {};
|
|
}
|
|
if ($.isEmptyObject(eventData)) {
|
|
return $("#L" + number).mousedown().click();
|
|
} else {
|
|
e = $.Event('mousedown', eventData);
|
|
return $("#L" + number).trigger(e).click();
|
|
}
|
|
};
|
|
beforeEach(function() {
|
|
loadFixtures('static/line_highlighter.html.raw');
|
|
this["class"] = new LineHighlighter();
|
|
this.css = this["class"].highlightClass;
|
|
return this.spies = {
|
|
__setLocationHash__: spyOn(this["class"], '__setLocationHash__').and.callFake(function() {})
|
|
};
|
|
});
|
|
describe('behavior', function() {
|
|
it('highlights one line given in the URL hash', function() {
|
|
new LineHighlighter('#L13');
|
|
return expect($('#LC13')).toHaveClass(this.css);
|
|
});
|
|
it('highlights a range of lines given in the URL hash', function() {
|
|
var line, results;
|
|
new LineHighlighter('#L5-25');
|
|
expect($("." + this.css).length).toBe(21);
|
|
results = [];
|
|
for (line = 5; line <= 25; line += 1) {
|
|
results.push(expect($("#LC" + line)).toHaveClass(this.css));
|
|
}
|
|
return results;
|
|
});
|
|
it('scrolls to the first highlighted line on initial load', function() {
|
|
var spy;
|
|
spy = spyOn($, 'scrollTo');
|
|
new LineHighlighter('#L5-25');
|
|
return expect(spy).toHaveBeenCalledWith('#L5', jasmine.anything());
|
|
});
|
|
it('discards click events', function() {
|
|
var spy;
|
|
spy = spyOnEvent('a[data-line-number]', 'click');
|
|
clickLine(13);
|
|
return expect(spy).toHaveBeenPrevented();
|
|
});
|
|
return it('handles garbage input from the hash', function() {
|
|
var func;
|
|
func = function() {
|
|
return new LineHighlighter('#blob-content-holder');
|
|
};
|
|
return expect(func).not.toThrow();
|
|
});
|
|
});
|
|
describe('#clickHandler', function() {
|
|
it('discards the mousedown event', function() {
|
|
var spy;
|
|
spy = spyOnEvent('a[data-line-number]', 'mousedown');
|
|
clickLine(13);
|
|
return expect(spy).toHaveBeenPrevented();
|
|
});
|
|
it('handles clicking on a child icon element', function() {
|
|
var spy;
|
|
spy = spyOn(this["class"], 'setHash').and.callThrough();
|
|
$('#L13 i').mousedown().click();
|
|
expect(spy).toHaveBeenCalledWith(13);
|
|
return expect($('#LC13')).toHaveClass(this.css);
|
|
});
|
|
describe('without shiftKey', function() {
|
|
it('highlights one line when clicked', function() {
|
|
clickLine(13);
|
|
return expect($('#LC13')).toHaveClass(this.css);
|
|
});
|
|
it('unhighlights previously highlighted lines', function() {
|
|
clickLine(13);
|
|
clickLine(20);
|
|
expect($('#LC13')).not.toHaveClass(this.css);
|
|
return expect($('#LC20')).toHaveClass(this.css);
|
|
});
|
|
return it('sets the hash', function() {
|
|
var spy;
|
|
spy = spyOn(this["class"], 'setHash').and.callThrough();
|
|
clickLine(13);
|
|
return expect(spy).toHaveBeenCalledWith(13);
|
|
});
|
|
});
|
|
return describe('with shiftKey', function() {
|
|
it('sets the hash', function() {
|
|
var spy;
|
|
spy = spyOn(this["class"], 'setHash').and.callThrough();
|
|
clickLine(13);
|
|
clickLine(20, {
|
|
shiftKey: true
|
|
});
|
|
expect(spy).toHaveBeenCalledWith(13);
|
|
return expect(spy).toHaveBeenCalledWith(13, 20);
|
|
});
|
|
describe('without existing highlight', function() {
|
|
it('highlights the clicked line', function() {
|
|
clickLine(13, {
|
|
shiftKey: true
|
|
});
|
|
expect($('#LC13')).toHaveClass(this.css);
|
|
return expect($("." + this.css).length).toBe(1);
|
|
});
|
|
return it('sets the hash', function() {
|
|
var spy;
|
|
spy = spyOn(this["class"], 'setHash');
|
|
clickLine(13, {
|
|
shiftKey: true
|
|
});
|
|
return expect(spy).toHaveBeenCalledWith(13);
|
|
});
|
|
});
|
|
describe('with existing single-line highlight', function() {
|
|
it('uses existing line as last line when target is lesser', function() {
|
|
var line, results;
|
|
clickLine(20);
|
|
clickLine(15, {
|
|
shiftKey: true
|
|
});
|
|
expect($("." + this.css).length).toBe(6);
|
|
results = [];
|
|
for (line = 15; line <= 20; line += 1) {
|
|
results.push(expect($("#LC" + line)).toHaveClass(this.css));
|
|
}
|
|
return results;
|
|
});
|
|
return it('uses existing line as first line when target is greater', function() {
|
|
var line, results;
|
|
clickLine(5);
|
|
clickLine(10, {
|
|
shiftKey: true
|
|
});
|
|
expect($("." + this.css).length).toBe(6);
|
|
results = [];
|
|
for (line = 5; line <= 10; line += 1) {
|
|
results.push(expect($("#LC" + line)).toHaveClass(this.css));
|
|
}
|
|
return results;
|
|
});
|
|
});
|
|
return describe('with existing multi-line highlight', function() {
|
|
beforeEach(function() {
|
|
clickLine(10, {
|
|
shiftKey: true
|
|
});
|
|
return clickLine(13, {
|
|
shiftKey: true
|
|
});
|
|
});
|
|
it('uses target as first line when it is less than existing first line', function() {
|
|
var line, results;
|
|
clickLine(5, {
|
|
shiftKey: true
|
|
});
|
|
expect($("." + this.css).length).toBe(6);
|
|
results = [];
|
|
for (line = 5; line <= 10; line += 1) {
|
|
results.push(expect($("#LC" + line)).toHaveClass(this.css));
|
|
}
|
|
return results;
|
|
});
|
|
return it('uses target as last line when it is greater than existing first line', function() {
|
|
var line, results;
|
|
clickLine(15, {
|
|
shiftKey: true
|
|
});
|
|
expect($("." + this.css).length).toBe(6);
|
|
results = [];
|
|
for (line = 10; line <= 15; line += 1) {
|
|
results.push(expect($("#LC" + line)).toHaveClass(this.css));
|
|
}
|
|
return results;
|
|
});
|
|
});
|
|
});
|
|
});
|
|
describe('#hashToRange', function() {
|
|
beforeEach(function() {
|
|
return this.subject = this["class"].hashToRange;
|
|
});
|
|
it('extracts a single line number from the hash', function() {
|
|
return expect(this.subject('#L5')).toEqual([5, null]);
|
|
});
|
|
it('extracts a range of line numbers from the hash', function() {
|
|
return expect(this.subject('#L5-15')).toEqual([5, 15]);
|
|
});
|
|
return it('returns [null, null] when the hash is not a line number', function() {
|
|
return expect(this.subject('#foo')).toEqual([null, null]);
|
|
});
|
|
});
|
|
describe('#highlightLine', function() {
|
|
beforeEach(function() {
|
|
return this.subject = this["class"].highlightLine;
|
|
});
|
|
it('highlights the specified line', function() {
|
|
this.subject(13);
|
|
return expect($('#LC13')).toHaveClass(this.css);
|
|
});
|
|
return it('accepts a String-based number', function() {
|
|
this.subject('13');
|
|
return expect($('#LC13')).toHaveClass(this.css);
|
|
});
|
|
});
|
|
return describe('#setHash', function() {
|
|
beforeEach(function() {
|
|
return this.subject = this["class"].setHash;
|
|
});
|
|
it('sets the location hash for a single line', function() {
|
|
this.subject(5);
|
|
return expect(this.spies.__setLocationHash__).toHaveBeenCalledWith('#L5');
|
|
});
|
|
return it('sets the location hash for a range', function() {
|
|
this.subject(5, 15);
|
|
return expect(this.spies.__setLocationHash__).toHaveBeenCalledWith('#L5-15');
|
|
});
|
|
});
|
|
});
|
|
}).call(this);
|