Merge branch '26226-generate-all-haml-fixtures-within-teaspoon-fixtures-task' into 'master'

Precompile all frontend test fixtures

Closes #26226

See merge request !8384
This commit is contained in:
Alfredo Sumaran 2017-01-06 16:12:59 +00:00
commit 57652bf584
45 changed files with 609 additions and 106 deletions

View File

@ -0,0 +1,4 @@
---
title: Precompile all JavaScript fixtures
merge_request: 8384
author:

View File

@ -1,15 +1,28 @@
{
"plugins": ["jasmine"],
"env": {
"jasmine": true
},
"extends": "plugin:jasmine/recommended",
"globals": {
"appendLoadFixtures": false,
"appendLoadStyleFixtures": false,
"appendSetFixtures": false,
"appendSetStyleFixtures": false,
"getJSONFixture": false,
"loadFixtures": false,
"loadJSONFixtures": false,
"loadStyleFixtures": false,
"preloadFixtures": false,
"preloadStyleFixtures": false,
"readFixtures": false,
"sandbox": false,
"setFixtures": false,
"setStyleFixtures": false,
"spyOnEvent": false
},
"plugins": ["jasmine"],
"rules": {
"prefer-arrow-callback": 0,
"func-names": 0
},
"globals": {
"fixture": false,
"spyOnEvent": false
}
}

View File

@ -13,10 +13,10 @@
(index, element) => element.innerText.indexOf(searchText) > -1,
).first();
fixture.preload(FIXTURE);
preloadFixtures(FIXTURE);
beforeEach(function () {
fixture.load(FIXTURE);
loadFixtures(FIXTURE);
this.abuseReports = new global.AbuseReports();
messages = $('.abuse-reports .message');
});

View File

@ -7,7 +7,7 @@
(() => {
window.gon || (window.gon = {});
const fixtureTemplate = 'event_filter.html';
const fixtureTemplate = 'static/event_filter.html.raw';
const filters = [
{
id: 'all',
@ -35,7 +35,7 @@
describe('Activities', () => {
beforeEach(() => {
fixture.load(fixtureTemplate);
loadFixtures(fixtureTemplate);
new gl.Activities();
});

View File

@ -34,9 +34,9 @@
};
describe('AwardsHandler', function() {
fixture.preload('issues/open-issue.html.raw');
preloadFixtures('issues/open-issue.html.raw');
beforeEach(function() {
fixture.load('issues/open-issue.html.raw');
loadFixtures('issues/open-issue.html.raw');
awardsHandler = new AwardsHandler;
spyOn(awardsHandler, 'postEmoji').and.callFake((function(_this) {
return function(url, emoji, cb) {

View File

@ -6,7 +6,7 @@
describe('Autosize behavior', function() {
var load;
beforeEach(function() {
return fixture.set('<textarea class="js-autosize" style="resize: vertical"></textarea>');
return setFixtures('<textarea class="js-autosize" style="resize: vertical"></textarea>');
});
it('does not overwrite the resize property', function() {
load();

View File

@ -5,9 +5,9 @@
(function() {
describe('Quick Submit behavior', function() {
var keydownEvent;
fixture.preload('behaviors/quick_submit.html');
preloadFixtures('static/behaviors/quick_submit.html.raw');
beforeEach(function() {
fixture.load('behaviors/quick_submit.html');
loadFixtures('static/behaviors/quick_submit.html.raw');
$('form').submit(function(e) {
// Prevent a form submit from moving us off the testing page
return e.preventDefault();

View File

@ -4,9 +4,9 @@
(function() {
describe('requiresInput', function() {
fixture.preload('behaviors/requires_input.html');
preloadFixtures('static/behaviors/requires_input.html.raw');
beforeEach(function() {
return fixture.load('behaviors/requires_input.html');
return loadFixtures('static/behaviors/requires_input.html.raw');
});
it('disables submit when any field is required', function() {
$('.js-requires-input').requiresInput();

View File

@ -2,10 +2,10 @@
(() => {
describe('Linked Tabs', () => {
fixture.preload('linked_tabs');
preloadFixtures('static/linked_tabs.html.raw');
beforeEach(() => {
fixture.load('linked_tabs');
loadFixtures('static/linked_tabs.html.raw');
});
describe('when is initialized', () => {

View File

@ -17,10 +17,10 @@ describe('Build', () => {
offset: BUILD_TRACE.length, n_open_tags: 0, fg_color: null, bg_color: null, style_mask: 0,
}));
fixture.preload('builds/build-with-artifacts.html.raw');
preloadFixtures('builds/build-with-artifacts.html.raw');
beforeEach(() => {
fixture.load('builds/build-with-artifacts.html.raw');
loadFixtures('builds/build-with-artifacts.html.raw');
spyOn($, 'ajax');
});

View File

@ -7,7 +7,7 @@
((global) => {
describe('Dashboard', () => {
const fixtureTemplate = 'dashboard.html';
const fixtureTemplate = 'static/dashboard.html.raw';
function todosCountText() {
return $('.js-todos-count').text();
@ -17,9 +17,9 @@
$(document).trigger('todo:toggle', newCount);
}
fixture.preload(fixtureTemplate);
preloadFixtures(fixtureTemplate);
beforeEach(() => {
fixture.load(fixtureTemplate);
loadFixtures(fixtureTemplate);
new global.Sidebar();
});

View File

@ -2,10 +2,10 @@
//= require environments/components/environment_actions
describe('Actions Component', () => {
fixture.preload('environments/element.html');
preloadFixtures('static/environments/element.html.raw');
beforeEach(() => {
fixture.load('environments/element.html');
loadFixtures('static/environments/element.html.raw');
});
it('should render a dropdown with the provided actions', () => {

View File

@ -2,9 +2,9 @@
//= require environments/components/environment_external_url
describe('External URL Component', () => {
fixture.preload('environments/element.html');
preloadFixtures('static/environments/element.html.raw');
beforeEach(() => {
fixture.load('environments/element.html');
loadFixtures('static/environments/element.html.raw');
});
it('should link to the provided externalUrl prop', () => {

View File

@ -3,9 +3,9 @@
//= require environments/components/environment_item
describe('Environment item', () => {
fixture.preload('environments/table.html');
preloadFixtures('static/environments/table.html.raw');
beforeEach(() => {
fixture.load('environments/table.html');
loadFixtures('static/environments/table.html.raw');
});
describe('When item is folder', () => {

View File

@ -1,12 +1,12 @@
//= require vue
//= require environments/components/environment_rollback
describe('Rollback Component', () => {
fixture.preload('environments/element.html');
preloadFixtures('static/environments/element.html.raw');
const retryURL = 'https://gitlab.com/retry';
beforeEach(() => {
fixture.load('environments/element.html');
loadFixtures('static/environments/element.html.raw');
});
it('Should link to the provided retryUrl', () => {

View File

@ -1,13 +1,13 @@
//= require vue
//= require environments/components/environment_stop
describe('Stop Component', () => {
fixture.preload('environments/element.html');
preloadFixtures('static/environments/element.html.raw');
let stopURL;
let component;
beforeEach(() => {
fixture.load('environments/element.html');
loadFixtures('static/environments/element.html.raw');
stopURL = '/stop';
component = new window.gl.environmentsList.StopComponent({

View File

@ -6,7 +6,7 @@
describe('jQuery extensions', function() {
describe('disable', function() {
beforeEach(function() {
return fixture.set('<input type="text" />');
return setFixtures('<input type="text" />');
});
it('adds the disabled attribute', function() {
var $input;
@ -23,7 +23,7 @@
});
return describe('enable', function() {
beforeEach(function() {
return fixture.set('<input type="text" disabled="disabled" class="disabled" />');
return setFixtures('<input type="text" disabled="disabled" class="disabled" />');
});
it('removes the disabled attribute', function() {
var $input;

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,31 @@
require 'spec_helper'
describe ApplicationController, '(Static JavaScript fixtures)', type: :controller do
include JavaScriptFixturesHelpers
before(:all) do
clean_frontend_fixtures('static/')
end
fixtures_path = File.expand_path(JavaScriptFixturesHelpers::FIXTURE_PATH, Rails.root)
haml_fixtures = Dir.glob(File.expand_path('**/*.haml', fixtures_path)).map do |file_path|
file_path.sub(/\A#{fixtures_path}#{File::SEPARATOR}/, '')
end
haml_fixtures.each do |template_file_name|
it "static/#{template_file_name.sub(/\.haml\z/, '.raw')}" do |example|
fixture_file_name = example.description
rendered = render_template(template_file_name)
store_frontend_fixture(rendered, fixture_file_name)
end
end
private
def render_template(template_file_name)
fixture_path = JavaScriptFixturesHelpers::FIXTURE_PATH
controller = ApplicationController.new
controller.prepend_view_path(fixture_path)
controller.render_to_string(template: template_file_name, layout: false)
end
end

View File

@ -43,8 +43,7 @@
}
describe('Dropdown', function describeDropdown() {
fixture.preload('gl_dropdown.html');
fixture.preload('projects.json');
preloadFixtures('static/gl_dropdown.html.raw');
function initDropDown(hasRemote, isFilterable) {
this.dropdownButtonElement = $('#js-project-dropdown', this.dropdownContainerElement).glDropdown({
@ -61,10 +60,10 @@
}
beforeEach(() => {
fixture.load('gl_dropdown.html');
loadFixtures('static/gl_dropdown.html.raw');
this.dropdownContainerElement = $('.dropdown.inline');
this.$dropdownMenuElement = $('.dropdown-menu', this.dropdownContainerElement);
this.projectsData = fixture.load('projects.json')[0];
this.projectsData = getJSONFixture('projects.json');
});
afterEach(() => {

View File

@ -4,11 +4,11 @@
//= require gl_field_errors
((global) => {
fixture.preload('gl_field_errors.html');
preloadFixtures('static/gl_field_errors.html.raw');
describe('GL Style Field Errors', function() {
beforeEach(function() {
fixture.load('gl_field_errors.html');
loadFixtures('static/gl_field_errors.html.raw');
const $form = this.$form = $('form.gl-show-field-errors');
this.fieldErrors = new global.GlFieldErrors($form);
});

View File

@ -7,7 +7,7 @@
describe('Header', function() {
var todosPendingCount = '.todos-pending-count';
var fixtureTemplate = 'header.html';
var fixtureTemplate = 'static/header.html.raw';
function isTodosCountHidden() {
return $(todosPendingCount).hasClass('hidden');
@ -17,9 +17,9 @@
$(document).trigger('todo:toggle', newCount);
}
fixture.preload(fixtureTemplate);
preloadFixtures(fixtureTemplate);
beforeEach(function() {
fixture.load(fixtureTemplate);
loadFixtures(fixtureTemplate);
});
it('should update todos-pending-count after receiving the todo:toggle event', function() {

View File

@ -21,10 +21,10 @@
}
describe('Issuable', () => {
fixture.preload('issuable_filter');
preloadFixtures('static/issuable_filter.html.raw');
beforeEach(() => {
fixture.load('issuable_filter');
loadFixtures('static/issuable_filter.html.raw');
Issuable.init();
});
@ -37,7 +37,7 @@
beforeEach(() => {
$filtersForm = $('.js-filter-form');
fixture.load('issuable_filter');
loadFixtures('static/issuable_filter.html.raw');
resetForm($filtersForm);
});

View File

@ -8,9 +8,9 @@
var INVALID_URL = 'http://goesnowhere.nothing/whereami';
var $boxClosed, $boxOpen, $btnClose, $btnReopen;
fixture.preload('issues/closed-issue.html');
fixture.preload('issues/issue-with-task-list.html');
fixture.preload('issues/open-issue.html');
preloadFixtures('issues/closed-issue.html.raw');
preloadFixtures('issues/issue-with-task-list.html.raw');
preloadFixtures('issues/open-issue.html.raw');
function expectErrorMessage() {
var $flashMessage = $('div.flash-alert');
@ -61,8 +61,8 @@
describe('Issue', function() {
describe('task lists', function() {
fixture.load('issues/issue-with-task-list.html');
beforeEach(function() {
loadFixtures('issues/issue-with-task-list.html.raw');
this.issue = new Issue();
});
@ -86,7 +86,7 @@
describe('close issue', function() {
beforeEach(function() {
fixture.load('issues/open-issue.html');
loadFixtures('issues/open-issue.html.raw');
findElements();
this.issue = new Issue();
@ -140,7 +140,7 @@
describe('reopen issue', function() {
beforeEach(function() {
fixture.load('issues/closed-issue.html');
loadFixtures('issues/closed-issue.html.raw');
findElements();
this.issue = new Issue();

View File

@ -17,10 +17,10 @@
(() => {
let saveLabelCount = 0;
describe('Issue dropdown sidebar', () => {
fixture.preload('issue_sidebar_label.html');
preloadFixtures('static/issue_sidebar_label.html.raw');
beforeEach(() => {
fixture.load('issue_sidebar_label.html');
loadFixtures('static/issue_sidebar_label.html.raw');
new IssuableContext('{"id":1,"name":"Administrator","username":"root"}');
new LabelsSelect();

View File

@ -6,7 +6,7 @@
(function() {
describe('LineHighlighter', function() {
var clickLine;
fixture.preload('line_highlighter.html');
preloadFixtures('static/line_highlighter.html.raw');
clickLine = function(number, eventData) {
var e;
if (eventData == null) {
@ -20,7 +20,7 @@
}
};
beforeEach(function() {
fixture.load('line_highlighter.html');
loadFixtures('static/line_highlighter.html.raw');
this["class"] = new LineHighlighter();
this.css = this["class"].highlightClass;
return this.spies = {

View File

@ -6,9 +6,9 @@
(function() {
describe('MergeRequest', function() {
return describe('task lists', function() {
fixture.preload('merge_requests_show.html');
preloadFixtures('static/merge_requests_show.html.raw');
beforeEach(function() {
fixture.load('merge_requests_show.html');
loadFixtures('static/merge_requests_show.html.raw');
return this.merge = new MergeRequest();
});
it('modifies the Markdown field', function() {

View File

@ -16,7 +16,7 @@
};
$.extend(stubLocation, defaults, stubs || {});
};
fixture.preload('merge_request_tabs.html');
preloadFixtures('static/merge_request_tabs.html.raw');
beforeEach(function () {
this.class = new gl.MergeRequestTabs({ stubLocation: stubLocation });
@ -30,7 +30,7 @@
describe('#activateTab', function () {
beforeEach(function () {
spyOn($, 'ajax').and.callFake(function () {});
fixture.load('merge_request_tabs.html');
loadFixtures('static/merge_request_tabs.html.raw');
this.subject = this.class.activateTab;
});
it('shows the first tab when action is show', function () {

View File

@ -5,10 +5,10 @@
(() => {
describe('Mini Pipeline Graph Dropdown', () => {
fixture.preload('mini_dropdown_graph');
preloadFixtures('static/mini_dropdown_graph.html.raw');
beforeEach(() => {
fixture.load('mini_dropdown_graph');
loadFixtures('static/mini_dropdown_graph.html.raw');
});
describe('When is initialized', () => {

View File

@ -8,7 +8,7 @@
describe('Branch', function() {
return describe('create a new branch', function() {
var expectToHaveError, fillNameWith;
fixture.preload('new_branch.html');
preloadFixtures('static/new_branch.html.raw');
fillNameWith = function(value) {
return $('.js-branch-name').val(value).trigger('blur');
};
@ -16,7 +16,7 @@
return expect($('.js-branch-name-error span').text()).toEqual(error);
};
beforeEach(function() {
fixture.load('new_branch.html');
loadFixtures('static/new_branch.html.raw');
$('form').on('submit', function(e) {
return e.preventDefault();
});

View File

@ -12,11 +12,11 @@
gl.utils = gl.utils || {};
describe('Notes', function() {
var commentsTemplate = 'issues/issue_with_comment.raw';
fixture.preload(commentsTemplate);
var commentsTemplate = 'issues/issue_with_comment.html.raw';
preloadFixtures(commentsTemplate);
beforeEach(function () {
fixture.load(commentsTemplate);
loadFixtures(commentsTemplate);
gl.utils.disableButtonIfEmptyField = _.noop;
window.project_uploads_path = 'http://test.host/uploads';
$('body').data('page', 'projects:issues:show');

View File

@ -2,10 +2,10 @@
(() => {
describe('Pipelines', () => {
fixture.preload('pipeline_graph');
preloadFixtures('static/pipeline_graph.html.raw');
beforeEach(() => {
fixture.load('pipeline_graph');
loadFixtures('static/pipeline_graph.html.raw');
});
it('should be defined', () => {

View File

@ -16,10 +16,9 @@
window.gon.api_version = 'v3';
describe('Project Title', function() {
fixture.preload('project_title.html');
fixture.preload('projects.json');
preloadFixtures('static/project_title.html.raw');
beforeEach(function() {
fixture.load('project_title.html');
loadFixtures('static/project_title.html.raw');
return this.project = new Project();
});
return describe('project list', function() {
@ -34,7 +33,7 @@
beforeEach((function(_this) {
return function() {
_this.projects_data = fixture.load('projects.json')[0];
_this.projects_data = getJSONFixture('projects.json');
return spyOn(jQuery, 'ajax').and.callFake(fakeAjaxResponse.bind(_this));
};
})(this));

View File

@ -36,9 +36,9 @@
describe('RightSidebar', function() {
var fixtureName = 'issues/open-issue.html.raw';
fixture.preload(fixtureName);
preloadFixtures(fixtureName);
beforeEach(function() {
fixture.load(fixtureName);
loadFixtures(fixtureName);
this.sidebar = new Sidebar;
$aside = $('.right-sidebar');
$page = $('.page-with-sidebar');
@ -65,9 +65,10 @@
});
it('should broadcast todo:toggle event when add todo clicked', function() {
var todos = getJSONFixture('todos.json');
spyOn(jQuery, 'ajax').and.callFake(function() {
var d = $.Deferred();
var response = fixture.load('todos.json');
var response = todos;
d.resolve(response);
return d.promise();
});

View File

@ -112,9 +112,9 @@
};
describe('Search autocomplete dropdown', function() {
fixture.preload('search_autocomplete.html');
preloadFixtures('static/search_autocomplete.html.raw');
beforeEach(function() {
fixture.load('search_autocomplete.html');
loadFixtures('static/search_autocomplete.html.raw');
return widget = new gl.SearchAutocomplete;
});
it('should show Dashboard specific dropdown menu', function() {

View File

@ -6,9 +6,9 @@
(function() {
describe('ShortcutsIssuable', function() {
var fixtureName = 'issues/open-issue.html.raw';
fixture.preload(fixtureName);
preloadFixtures(fixtureName);
beforeEach(function() {
fixture.load(fixtureName);
loadFixtures(fixtureName);
document.querySelector('.js-new-note-form').classList.add('js-main-target-form');
return this.shortcut = new ShortcutsIssuable();
});

View File

@ -2,7 +2,7 @@
((global) => {
describe('SigninTabsMemoizer', () => {
const fixtureTemplate = 'signin_tabs.html';
const fixtureTemplate = 'static/signin_tabs.html.raw';
const tabSelector = 'ul.nav-tabs';
const currentTabKey = 'current_signin_tab';
let memo;
@ -15,10 +15,10 @@
return memo;
}
fixture.preload(fixtureTemplate);
preloadFixtures(fixtureTemplate);
beforeEach(() => {
fixture.load(fixtureTemplate);
loadFixtures(fixtureTemplate);
});
it('does nothing if no tab was previously selected', () => {

View File

@ -103,7 +103,7 @@
describe('DOM Events', function () {
beforeEach(function () {
// This ensures DOM and DOM events are initialized for these specs.
fixture.set('<div></div>');
setFixtures('<div></div>');
this.smartInterval = createDefaultSmartInterval();
});

View File

@ -37,12 +37,12 @@
// file as a manifest.
// For more information: http://github.com/modeset/teaspoon
(function() {
}).call(this);
// set our fixtures path
jasmine.getFixtures().fixturesPath = '/teaspoon/fixtures';
jasmine.getJSONFixtures().fixturesPath = '/teaspoon/fixtures';
// defined in ActionDispatch::TestRequest
// see https://github.com/rails/rails/blob/v4.2.7.1/actionpack/lib/action_dispatch/testing/test_request.rb#L7
window.gl = window.gl || {};
gl.TEST_HOST = 'http://test.host';
window.gl.TEST_HOST = 'http://test.host';
window.gon = window.gon || {};

View File

@ -13,7 +13,7 @@
};
describe('on a js-syntax-highlight element', function() {
beforeEach(function() {
return fixture.set('<div class="js-syntax-highlight"></div>');
return setFixtures('<div class="js-syntax-highlight"></div>');
});
return it('applies syntax highlighting', function() {
stubUserColorScheme('monokai');
@ -23,7 +23,7 @@
});
return describe('on a parent element', function() {
beforeEach(function() {
return fixture.set("<div class=\"parent\">\n <div class=\"js-syntax-highlight\"></div>\n <div class=\"foo\"></div>\n <div class=\"js-syntax-highlight\"></div>\n</div>");
return setFixtures("<div class=\"parent\">\n <div class=\"js-syntax-highlight\"></div>\n <div class=\"foo\"></div>\n <div class=\"js-syntax-highlight\"></div>\n</div>");
});
it('applies highlighting to all applicable children', function() {
stubUserColorScheme('monokai');
@ -33,7 +33,7 @@
});
return it('prevents an infinite loop when no matches exist', function() {
var highlight;
fixture.set('<div></div>');
setFixtures('<div></div>');
highlight = function() {
return $('div').syntaxHighlight();
};

View File

@ -10,10 +10,10 @@
(function() {
describe('U2FAuthenticate', function() {
fixture.preload('u2f/authenticate.html.raw');
preloadFixtures('u2f/authenticate.html.raw');
beforeEach(function() {
fixture.load('u2f/authenticate.html.raw');
loadFixtures('u2f/authenticate.html.raw');
this.u2fDevice = new MockU2FDevice;
this.container = $("#js-authenticate-u2f");
this.component = new window.gl.U2FAuthenticate(

View File

@ -10,10 +10,10 @@
(function() {
describe('U2FRegister', function() {
fixture.preload('u2f/register.html.raw');
preloadFixtures('u2f/register.html.raw');
beforeEach(function() {
fixture.load('u2f/register.html.raw');
loadFixtures('u2f/register.html.raw');
this.u2fDevice = new MockU2FDevice;
this.container = $("#js-register-u2f");
this.component = new U2FRegister(this.container, $("#js-register-u2f-templates"), {}, "token");

View File

@ -5,7 +5,7 @@ describe('Commit component', () => {
let component;
it('should render a code-fork icon if it does not represent a tag', () => {
fixture.set('<div class="test-commit-container"></div>');
setFixtures('<div class="test-commit-container"></div>');
component = new window.gl.CommitComponent({
el: document.querySelector('.test-commit-container'),
propsData: {
@ -30,7 +30,7 @@ describe('Commit component', () => {
describe('Given all the props', () => {
beforeEach(() => {
fixture.set('<div class="test-commit-container"></div>');
setFixtures('<div class="test-commit-container"></div>');
props = {
tag: true,
@ -105,7 +105,7 @@ describe('Commit component', () => {
describe('When commit title is not provided', () => {
it('should render default message', () => {
fixture.set('<div class="test-commit-container"></div>');
setFixtures('<div class="test-commit-container"></div>');
props = {
tag: false,
commitRef: {

View File

@ -10,9 +10,9 @@
describe('ZenMode', function() {
var fixtureName = 'issues/open-issue.html.raw';
fixture.preload(fixtureName);
preloadFixtures(fixtureName);
beforeEach(function() {
fixture.load(fixtureName);
loadFixtures(fixtureName);
spyOn(Dropzone, 'forElement').and.callFake(function() {
return {
enable: function() {

View File

@ -20,11 +20,24 @@ module JavaScriptFixturesHelpers
# Public: Store a response object as fixture file
#
# response - response object to store
# response - string or response object to store
# fixture_file_name - file name to store the fixture in (relative to FIXTURE_PATH)
#
def store_frontend_fixture(response, fixture_file_name)
fixture_file_name = File.expand_path(fixture_file_name, FIXTURE_PATH)
fixture = response.respond_to?(:body) ? parse_response(response) : response
FileUtils.mkdir_p(File.dirname(fixture_file_name))
File.write(fixture_file_name, fixture)
end
private
# Private: Prepare a response object for use as a frontend fixture
#
# response - response object to prepare
#
def parse_response(response)
fixture = response.body
fixture.force_encoding("utf-8")
@ -45,7 +58,6 @@ module JavaScriptFixturesHelpers
fixture.gsub!(%r{="/}, "=\"http://#{test_host}/")
end
FileUtils.mkdir_p(File.dirname(fixture_file_name))
File.write(fixture_file_name, fixture)
fixture
end
end