Merge "Drop QUnit JS tests in favor of Jasmine"
This commit is contained in:
commit
83f198f8f6
@ -44,7 +44,8 @@ urlpatterns += patterns(
|
|||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
urlpatterns += patterns(
|
urlpatterns += patterns(
|
||||||
'',
|
'',
|
||||||
url(r'^qunit/$',
|
url(r'^jasmine-legacy/$',
|
||||||
TemplateView.as_view(template_name="horizon/qunit.html"),
|
TemplateView.as_view(
|
||||||
name='qunit_tests'),
|
template_name="horizon/jasmine/jasmine_legacy.html"),
|
||||||
|
name='jasmine_tests'),
|
||||||
url(r'^jasmine/.*?$', jasmine.dispatcher))
|
url(r'^jasmine/.*?$', jasmine.dispatcher))
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
module("Instances (horizon.instances.js)");
|
describe('Instances (horizon.instances.js)', function () {
|
||||||
|
var password;
|
||||||
test("decrypt password ", function () {
|
var enc_password = "dusPDCoY0u7PqDgVE6M+XicV+8V1qQkuPipM+KoCJ5cS" +
|
||||||
var encPassword, privateKey, password;
|
|
||||||
encPassword = "dusPDCoY0u7PqDgVE6M+XicV+8V1qQkuPipM+KoCJ5cS" +
|
|
||||||
"i8Bo64WOspsgjBQwC9onGX5pHwbgZdtintG1QNiDTafNbtNNbRoZQwO" +
|
"i8Bo64WOspsgjBQwC9onGX5pHwbgZdtintG1QNiDTafNbtNNbRoZQwO" +
|
||||||
"4Zm3Liiw9ymDdiy1GNwMduFiRP9WG5N4QE3TP3ChnWnVGYQE/QoHqa/" +
|
"4Zm3Liiw9ymDdiy1GNwMduFiRP9WG5N4QE3TP3ChnWnVGYQE/QoHqa/" +
|
||||||
"7e43LXYvLULQA7tQ7JxhJruRZVt/tskPJGEbgpyjiA3gECjFi12BAKD" +
|
"7e43LXYvLULQA7tQ7JxhJruRZVt/tskPJGEbgpyjiA3gECjFi12BAKD" +
|
||||||
@ -10,7 +8,7 @@ test("decrypt password ", function () {
|
|||||||
"LXZhGaZgMRVKnKREkkTxfmLWtdY5lsWP4dnvHama+k9Ku8LQ+n4qB07" +
|
"LXZhGaZgMRVKnKREkkTxfmLWtdY5lsWP4dnvHama+k9Ku8LQ+n4qB07" +
|
||||||
"jFVAUmRkpbdDPJ9Nxtlep0g==";
|
"jFVAUmRkpbdDPJ9Nxtlep0g==";
|
||||||
|
|
||||||
privateKey = "-----BEGIN RSA PRIVATE KEY-----" +
|
var private_key_1 = "-----BEGIN RSA PRIVATE KEY-----" +
|
||||||
"MIIEpAIBAAKCAQEAtY2Be8SoiE5XD/p7WaO2dKUES5iI4l4YAJ1FfpLGsT5mkC1t" +
|
"MIIEpAIBAAKCAQEAtY2Be8SoiE5XD/p7WaO2dKUES5iI4l4YAJ1FfpLGsT5mkC1t" +
|
||||||
"7Zl0QTMVMdUNYH7ERIKNv8OSZ/wmm716iStiYPzwjyXUA8uVQuoprUr8hPOeNeHK" +
|
"7Zl0QTMVMdUNYH7ERIKNv8OSZ/wmm716iStiYPzwjyXUA8uVQuoprUr8hPOeNeHK" +
|
||||||
"f1Nt7F87EPHk/n0VkLsUGZnwxVV1X3hgKS/f2gyPjkKwC+LOTMx81k65kp0a0Qt4" +
|
"f1Nt7F87EPHk/n0VkLsUGZnwxVV1X3hgKS/f2gyPjkKwC+LOTMx81k65kp0a0Qt4" +
|
||||||
@ -38,21 +36,7 @@ test("decrypt password ", function () {
|
|||||||
"3ns5u8JfZ0JobJ5JxiKHS3UOqfe9DV2pvVSyF3nLl8I0WPMgoEXrLw==" +
|
"3ns5u8JfZ0JobJ5JxiKHS3UOqfe9DV2pvVSyF3nLl8I0WPMgoEXrLw==" +
|
||||||
"-----END RSA PRIVATE KEY-----";
|
"-----END RSA PRIVATE KEY-----";
|
||||||
|
|
||||||
password = horizon.instances.decrypt_password(encPassword, privateKey);
|
var private_key_2 = "-----BEGIN RSA PRIVATE KEY-----" +
|
||||||
ok(password === "kLhfIDlK5e7v12");
|
|
||||||
});
|
|
||||||
|
|
||||||
test("decrypt password fake key", function () {
|
|
||||||
var encPassword, privateKey, password;
|
|
||||||
encPassword = "dusPDCoY0u7PqDgVE6M+XicV+8V1qQkuPipM+KoCJ5cS" +
|
|
||||||
"i8Bo64WOspsgjBQwC9onGX5pHwbgZdtintG1QNiDTafNbtNNbRoZQwO" +
|
|
||||||
"4Zm3Liiw9ymDdiy1GNwMduFiRP9WG5N4QE3TP3ChnWnVGYQE/QoHqa/" +
|
|
||||||
"7e43LXYvLULQA7tQ7JxhJruRZVt/tskPJGEbgpyjiA3gECjFi12BAKD" +
|
|
||||||
"3RKF2dA+kMzv65ZeKi/ux/2cTQEu83hk1kgWihx2jl0+5rnWSOrl6WR" +
|
|
||||||
"LXZhGaZgMRVKnKREkkTxfmLWtdY5lsWP4dnvHama+k9Ku8LQ+n4qB07" +
|
|
||||||
"jFVAUmRkpbdDPJ9Nxtlep0g==";
|
|
||||||
|
|
||||||
privateKey = "-----BEGIN RSA PRIVATE KEY-----" +
|
|
||||||
"MIIEpAIBAAKCAQEAtY2Be8SoiE5XD/p7WaO2dKUES5iI4l4YAJ1FfpLGsT5mkC1t" +
|
"MIIEpAIBAAKCAQEAtY2Be8SoiE5XD/p7WaO2dKUES5iI4l4YAJ1FfpLGsT5mkC1t" +
|
||||||
"Lq3//CLBSnm7gWdOsdU4rBn1khGKrlNdpvIjwkbMYtGlhjbvtwX3JbLlC8If9U00" +
|
"Lq3//CLBSnm7gWdOsdU4rBn1khGKrlNdpvIjwkbMYtGlhjbvtwX3JbLlC8If9U00" +
|
||||||
"NbobtwKBgQCxp5+NmeU+NHXeG4wFLyT+hkZncapmV8QvlYmqMuEC6G2rjmplobgX" +
|
"NbobtwKBgQCxp5+NmeU+NHXeG4wFLyT+hkZncapmV8QvlYmqMuEC6G2rjmplobgX" +
|
||||||
@ -60,6 +44,13 @@ test("decrypt password fake key", function () {
|
|||||||
"3ns5u8JfZ0JobJ5JxiKHS3UOqfe9DV2pvVSyF3nLl8I0WPMgoEXrLw==" +
|
"3ns5u8JfZ0JobJ5JxiKHS3UOqfe9DV2pvVSyF3nLl8I0WPMgoEXrLw==" +
|
||||||
"-----END RSA PRIVATE KEY-----";
|
"-----END RSA PRIVATE KEY-----";
|
||||||
|
|
||||||
password = horizon.instances.decrypt_password(encPassword, privateKey);
|
it("decrypt password", function () {
|
||||||
ok(password === false || password === null);
|
password = horizon.instances.decrypt_password(enc_password, private_key_1);
|
||||||
|
expect(password).toEqual("kLhfIDlK5e7v12");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("decrypt password fake key", function () {
|
||||||
|
password = horizon.instances.decrypt_password(enc_password, private_key_2);
|
||||||
|
expect(password).toBe(false);
|
||||||
|
});
|
||||||
});
|
});
|
38
horizon/static/horizon/tests/jasmine/messages.legacy-spec.js
Normal file
38
horizon/static/horizon/tests/jasmine/messages.legacy-spec.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
describe("Messages (horizon.messages.js)", function () {
|
||||||
|
var message, message2;
|
||||||
|
|
||||||
|
it("Basic Alert", function () {
|
||||||
|
message = horizon.alert("success", "A message!");
|
||||||
|
expect(message.hasClass("alert-success")).toBe(true);
|
||||||
|
expect($('#main_content .messages .alert').length).toEqual(1);
|
||||||
|
|
||||||
|
horizon.clearAllMessages();
|
||||||
|
expect($('#main_content .messages .alert').length).toEqual(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Multiple Alerts", function () {
|
||||||
|
message = horizon.alert("error", "An error!");
|
||||||
|
expect(message.hasClass("alert-danger")).toBe(true);
|
||||||
|
|
||||||
|
message2 = horizon.alert("success", "Another message");
|
||||||
|
expect($('#main_content .messages .alert').length).toEqual(2);
|
||||||
|
|
||||||
|
horizon.clearErrorMessages();
|
||||||
|
expect($('#main_content .messages .alert-danger').length).toEqual(0);
|
||||||
|
expect($('#main_content .messages .alert').length).toEqual(1);
|
||||||
|
|
||||||
|
horizon.clearSuccessMessages();
|
||||||
|
expect($('#main_content .messages .alert-success').length).toEqual(0);
|
||||||
|
expect($('#main_content .messages .alert').length).toEqual(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Alert With HTML Tag", function () {
|
||||||
|
var safe_string = "A safe message <a>here</a>!";
|
||||||
|
message = horizon.alert("success", safe_string, "safe");
|
||||||
|
expect(message.length).toEqual(1);
|
||||||
|
expect(message.html().indexOf(safe_string)).not.toEqual(-1);
|
||||||
|
expect($('#main_content .messages .alert').length).toEqual(1);
|
||||||
|
horizon.clearAllMessages();
|
||||||
|
expect($('#main_content .messages .alert').length).toEqual(0);
|
||||||
|
});
|
||||||
|
});
|
25
horizon/static/horizon/tests/jasmine/modals.legacy-spec.js
Normal file
25
horizon/static/horizon/tests/jasmine/modals.legacy-spec.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
describe("Modals (horizon.modals.js)", function () {
|
||||||
|
var modal, title, body, confirm;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
title = "Test Title";
|
||||||
|
body = "<p>Test Body</p>";
|
||||||
|
confirm = "Test Confirm";
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Modal Creation", function () {
|
||||||
|
|
||||||
|
modal = horizon.modals.create(title, body, confirm);
|
||||||
|
expect(modal.length).toEqual(1);
|
||||||
|
|
||||||
|
modal = $("#modal_wrapper .modal");
|
||||||
|
modal.modal();
|
||||||
|
expect(modal.length).toEqual(1);
|
||||||
|
expect(modal.hasClass("in")).toBe(true);
|
||||||
|
expect(modal.find("h3").text()).toEqual(title);
|
||||||
|
expect(modal.find(".modal-body").text().trim()).toEqual(body);
|
||||||
|
expect(modal.find(".modal-footer .btn-primary").text()).toEqual(confirm);
|
||||||
|
modal.find(".modal-footer .cancel").click();
|
||||||
|
expect(modal.hasClass("in")).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
122
horizon/static/horizon/tests/jasmine/tables.legacy-spec.js
Normal file
122
horizon/static/horizon/tests/jasmine/tables.legacy-spec.js
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
describe("Tables (horizon.tables.js)", function () {
|
||||||
|
|
||||||
|
describe("can hide or reveal column,", function () {
|
||||||
|
var fixture, table;
|
||||||
|
beforeEach(function () {
|
||||||
|
fixture = $("#jasmine-fixture");
|
||||||
|
table = fixture.find("#table2");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("with a default behaviour.", function () {
|
||||||
|
expect(table.find(".cat").is(":hidden")).toBe(false);
|
||||||
|
expect(table.find(":not(.cat)").is(":hidden")).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("by activating a filter.", function () {
|
||||||
|
$("#button_dogs").trigger("click");
|
||||||
|
expect(table.find(".dog").is(":hidden")).toBe(false);
|
||||||
|
expect(table.find(":not(.dog)").is(":hidden")).toBe(true);
|
||||||
|
|
||||||
|
$("#button_big").trigger("click");
|
||||||
|
expect(table.find(".big").is(":hidden")).toBe(false);
|
||||||
|
expect(table.find(":not(.big)").is(":hidden")).toBe(true);
|
||||||
|
|
||||||
|
$("#button_cats").trigger("click");
|
||||||
|
expect(table.find(".cat").is(":hidden")).toBe(false);
|
||||||
|
expect(table.find(":not(.cat)").is(":hidden")).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("can provide a footer counter,", function () {
|
||||||
|
var table, tbody, table_count, rows;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
table = $("#table1");
|
||||||
|
tbody = table.find('tbody');
|
||||||
|
table_count = table.find("span.table_count");
|
||||||
|
rows = tbody.find('tr');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("which count the number of items.", function () {
|
||||||
|
horizon.datatables.update_footer_count(table);
|
||||||
|
expect(table_count.text()).toContain('4 items');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("which can be updated", function () {
|
||||||
|
rows.first().hide();
|
||||||
|
rows.first().next().hide();
|
||||||
|
horizon.datatables.update_footer_count(table);
|
||||||
|
expect(table_count.text()).toContain('2 items');
|
||||||
|
|
||||||
|
rows.first().next().show();
|
||||||
|
horizon.datatables.update_footer_count(table);
|
||||||
|
expect(table_count.text()).toContain('3 items');
|
||||||
|
|
||||||
|
$('<tr><td>cat3</td></tr>"').appendTo(tbody);
|
||||||
|
$('<tr><td>cat4</td></tr>"').appendTo(tbody);
|
||||||
|
horizon.datatables.update_footer_count(table);
|
||||||
|
expect(table_count.text()).toContain('5 items');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("Formset rows:", function () {
|
||||||
|
var html, table, input, row, empty_row_html, x;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
html = $('#formset');
|
||||||
|
table = html.find('table');
|
||||||
|
row = table.find('tbody tr').first();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("reenumerate", function () {
|
||||||
|
input = table.find('tbody tr#flavors__row__14 input').first();
|
||||||
|
input.attr('id', 'id_flavors-3-name');
|
||||||
|
horizon.formset_table.reenumerate_rows(table, 'flavors');
|
||||||
|
expect(input.attr('id')).toEqual('id_flavors-0-name');
|
||||||
|
input.attr('id', 'id_flavors-__prefix__-name');
|
||||||
|
horizon.formset_table.reenumerate_rows(table, 'flavors');
|
||||||
|
expect(input.attr('id')).toEqual('id_flavors-0-name');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("delete", function () {
|
||||||
|
input = row.find('input#id_flavors-0-DELETE');
|
||||||
|
expect(row.css("display")).toEqual('table-row');
|
||||||
|
expect(input.attr('checked')).toEqual(undefined);
|
||||||
|
horizon.formset_table.replace_delete(row);
|
||||||
|
x = input.next('a');
|
||||||
|
horizon.formset_table.delete_row.call(x);
|
||||||
|
expect(row.css("display")).toEqual('none');
|
||||||
|
expect(input.attr('checked')).toEqual('checked');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("add", function () {
|
||||||
|
empty_row_html = '<tr><td><input id="id_flavors-__prefix__-name" name="flavors-__prefix__-name"></td></tr>';
|
||||||
|
expect(table.find('tbody tr').length).toEqual(3);
|
||||||
|
expect(html.find('#id_flavors-TOTAL_FORMS').val()).toEqual("3");
|
||||||
|
horizon.formset_table.add_row(table, 'flavors', empty_row_html);
|
||||||
|
expect(table.find('tbody tr').length).toEqual(4);
|
||||||
|
expect(table.find('tbody tr:last input').attr('id')).toEqual('id_flavors-3-name');
|
||||||
|
expect(html.find('#id_flavors-TOTAL_FORMS').val()).toEqual("4");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("Init formset table", function () {
|
||||||
|
var html, table;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
html = $('#formset');
|
||||||
|
table = html.find('table');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("add row", function () {
|
||||||
|
horizon.formset_table.init('flavors', '', 'Add row');
|
||||||
|
expect(table.find('tfoot tr a').html()).toEqual('Add row');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("no add row", function () {
|
||||||
|
$('tfoot tr a').remove();
|
||||||
|
horizon.formset_table.init('flavors', '', '');
|
||||||
|
expect(table.find('tfoot tr a').length).toEqual(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,9 @@
|
|||||||
|
describe("Client-Side Templating (horizon.templates.js)", function () {
|
||||||
|
it("Compiled templates list should not be empty.", function () {
|
||||||
|
var size = 0;
|
||||||
|
angular.forEach(horizon.templates.compiled_templates, function () {
|
||||||
|
size = size + 1;
|
||||||
|
});
|
||||||
|
expect(size).toBeGreaterThan(0);
|
||||||
|
});
|
||||||
|
});
|
@ -1,50 +0,0 @@
|
|||||||
horizon.addInitFunction(function () {
|
|
||||||
module("Messages (horizon.messages.js)");
|
|
||||||
var message, message2;
|
|
||||||
|
|
||||||
test("Basic Alert", function () {
|
|
||||||
message = horizon.alert("success", "A message!");
|
|
||||||
ok(message, "Create a success message.");
|
|
||||||
ok(message.hasClass("alert-success"),
|
|
||||||
'Verify the message has the "alert-success" class.');
|
|
||||||
equal($('#main_content .messages .alert').length, 1,
|
|
||||||
"Verify our message was added to the DOM.");
|
|
||||||
horizon.clearAllMessages();
|
|
||||||
equal($('#main_content .messages .alert').length, 0,
|
|
||||||
"Verify our message was removed.");
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Multiple Alerts", function () {
|
|
||||||
message = horizon.alert("error", "An error!");
|
|
||||||
ok(message.hasClass("alert-danger"),
|
|
||||||
'Verify the first message has the "alert-danger" class.');
|
|
||||||
|
|
||||||
message2 = horizon.alert("success", "Another message");
|
|
||||||
equal($('#main_content .messages .alert').length, 2,
|
|
||||||
"Verify two messages have been added to the DOM.");
|
|
||||||
|
|
||||||
horizon.clearErrorMessages();
|
|
||||||
equal($('#main_content .messages .alert-danger').length, 0,
|
|
||||||
"Verify our error message was removed.");
|
|
||||||
equal($('#main_content .messages .alert').length, 1,
|
|
||||||
"Verify one message remains.");
|
|
||||||
horizon.clearSuccessMessages();
|
|
||||||
equal($('#main_content .messages .alert-success').length, 0,
|
|
||||||
"Verify our success message was removed.");
|
|
||||||
equal($('#main_content .messages .alert').length, 0,
|
|
||||||
"Verify no messages remain.");
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Alert With HTML Tag", function () {
|
|
||||||
var safeString = "A safe message <a>here</a>!";
|
|
||||||
message = horizon.alert("success", safeString, "safe");
|
|
||||||
ok(message, "Create a message with extra tag.");
|
|
||||||
ok((message.html().indexOf(safeString) !== -1),
|
|
||||||
"Verify the message with HTML tag was not escaped.");
|
|
||||||
equal($('#main_content .messages .alert').length, 1,
|
|
||||||
"Verify our message was added to the DOM.");
|
|
||||||
horizon.clearAllMessages();
|
|
||||||
equal($('#main_content .messages .alert').length, 0,
|
|
||||||
"Verify our message was removed.");
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,25 +0,0 @@
|
|||||||
horizon.addInitFunction(function () {
|
|
||||||
module("Modals (horizon.modals.js)");
|
|
||||||
|
|
||||||
test("Modal Creation", function () {
|
|
||||||
var modal;
|
|
||||||
var title = "Test Title";
|
|
||||||
var body = "<p>Test Body</p>";
|
|
||||||
var confirm = "Test Confirm";
|
|
||||||
modal = horizon.modals.create(title, body, confirm);
|
|
||||||
ok(modal, "Verify our modal was created.");
|
|
||||||
|
|
||||||
modal = $("#modal_wrapper .modal");
|
|
||||||
modal.modal();
|
|
||||||
equal(modal.length, 1, "Verify our modal was added to the DOM.");
|
|
||||||
ok(modal.hasClass("in"), "Verify our modal is not hidden.");
|
|
||||||
equal(modal.find("h3").text(), title,
|
|
||||||
"Verify the title was added correctly.");
|
|
||||||
equal(modal.find(".modal-body").text().trim(), body,
|
|
||||||
"Verify the body was added correctly.");
|
|
||||||
equal(modal.find(".modal-footer .btn-primary").text(), confirm,
|
|
||||||
"Verify the footer confirm button was added correctly.");
|
|
||||||
modal.find(".modal-footer .cancel").click();
|
|
||||||
ok(!modal.hasClass("in"), "Verify our modal is hidden.");
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,115 +0,0 @@
|
|||||||
module("Tables (horizon.tables.js)");
|
|
||||||
|
|
||||||
test("Row filtering (fixed)", function () {
|
|
||||||
var fixture = $("#qunit-fixture");
|
|
||||||
var table = fixture.find("#table2");
|
|
||||||
|
|
||||||
ok(!table.find(".cat").is(":hidden"), "Filtering cats: cats visible by default");
|
|
||||||
ok(table.find(":not(.cat)").is(":hidden"), "Filtering cats: non-cats hidden by default");
|
|
||||||
|
|
||||||
$("#button_cats").trigger("click");
|
|
||||||
ok(!table.find(".cat").is(":hidden"), "Filtering cats: cats visible");
|
|
||||||
ok(table.find(":not(.cat)").is(":hidden"), "Filtering cats: non-cats hidden");
|
|
||||||
|
|
||||||
$("#button_dogs").trigger("click");
|
|
||||||
ok(!table.find(".dog").is(":hidden"), "Filtering dogs: dogs visible");
|
|
||||||
ok(table.find(":not(.dog)").is(":hidden"), "Filtering dogs: non-dogs hidden");
|
|
||||||
|
|
||||||
$("#button_big").trigger("click");
|
|
||||||
ok(!table.find(".big").is(":hidden"), "Filtering big animals: big visible");
|
|
||||||
ok(table.find(":not(.big)").is(":hidden"), "Filtering big animals: non-big hidden");
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Footer count update", function () {
|
|
||||||
var fixture = $("#qunit-fixture");
|
|
||||||
var table = fixture.find("#table1");
|
|
||||||
var tbody = table.find('tbody');
|
|
||||||
var tableCount = table.find("span.table_count");
|
|
||||||
var rows = tbody.find('tr');
|
|
||||||
|
|
||||||
// The following function returns the first set of consecutive numbers.
|
|
||||||
// This is allows you to match an inner numeric value regardless of
|
|
||||||
// the language and regardless of placement within the phrase.
|
|
||||||
// If you want to match '4' for your numeric value, the following are ok:
|
|
||||||
// "there are 4 lights", "4 lights there are", "lights there are 4" but
|
|
||||||
// not "there are 14 lights".
|
|
||||||
var getConsecNums = function(str) { return (str.match(/\d+/) || [""])[0]; };
|
|
||||||
|
|
||||||
horizon.datatables.update_footer_count(table);
|
|
||||||
equal(getConsecNums(tableCount.text()), '4', "Initial count is correct");
|
|
||||||
|
|
||||||
// hide rows
|
|
||||||
rows.first().hide();
|
|
||||||
rows.first().next().hide();
|
|
||||||
horizon.datatables.update_footer_count(table);
|
|
||||||
equal(getConsecNums(tableCount.text()), '2', "Count correct after hiding two rows");
|
|
||||||
|
|
||||||
// show a row
|
|
||||||
rows.first().next().show();
|
|
||||||
horizon.datatables.update_footer_count(table);
|
|
||||||
equal(getConsecNums(tableCount.text()), '3', "Count correct after showing one row");
|
|
||||||
|
|
||||||
// add rows
|
|
||||||
$('<tr><td>cat3</td></tr>"').appendTo(tbody);
|
|
||||||
$('<tr><td>cat4</td></tr>"').appendTo(tbody);
|
|
||||||
horizon.datatables.update_footer_count(table);
|
|
||||||
equal(getConsecNums(tableCount.text()), '5', "Count correct after adding two rows");
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Formset reenumerate rows", function () {
|
|
||||||
var html = $('#formset');
|
|
||||||
var table = html.find('table');
|
|
||||||
var input = table.find('tbody tr#flavors__row__14 input').first();
|
|
||||||
|
|
||||||
input.attr('id', 'id_flavors-3-name');
|
|
||||||
horizon.formset_table.reenumerate_rows(table, 'flavors');
|
|
||||||
equal(input.attr('id'), 'id_flavors-0-name', "Enumerate old rows ids");
|
|
||||||
input.attr('id', 'id_flavors-__prefix__-name');
|
|
||||||
horizon.formset_table.reenumerate_rows(table, 'flavors');
|
|
||||||
equal(input.attr('id'), 'id_flavors-0-name', "Enumerate new rows ids");
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Formset delete row", function () {
|
|
||||||
var html = $('#formset');
|
|
||||||
var table = html.find('table');
|
|
||||||
var row = table.find('tbody tr').first();
|
|
||||||
var input = row.find('input#id_flavors-0-DELETE');
|
|
||||||
|
|
||||||
equal(row.css("display"), 'table-row');
|
|
||||||
equal(input.attr('checked'), undefined);
|
|
||||||
horizon.formset_table.replace_delete(row);
|
|
||||||
var x = input.next('a');
|
|
||||||
horizon.formset_table.delete_row.call(x);
|
|
||||||
equal(row.css("display"), 'none');
|
|
||||||
equal(input.attr('checked'), 'checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Formset add row", function() {
|
|
||||||
var html = $('#formset');
|
|
||||||
var table = html.find('table');
|
|
||||||
var emptyRowHtml = '<tr><td><input id="id_flavors-__prefix__-name" ' +
|
|
||||||
'name="flavors-__prefix__-name"></td></tr>';
|
|
||||||
|
|
||||||
equal(table.find('tbody tr').length, 3);
|
|
||||||
equal(html.find('#id_flavors-TOTAL_FORMS').val(), 3);
|
|
||||||
horizon.formset_table.add_row(table, 'flavors', emptyRowHtml);
|
|
||||||
equal(table.find('tbody tr').length, 4);
|
|
||||||
equal(table.find('tbody tr:last input').attr('id'), 'id_flavors-3-name');
|
|
||||||
equal(html.find('#id_flavors-TOTAL_FORMS').val(), 4);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Init formset table", function() {
|
|
||||||
var html = $('#formset');
|
|
||||||
var table = html.find('table');
|
|
||||||
|
|
||||||
horizon.formset_table.init('flavors', '', 'Add row');
|
|
||||||
equal(table.find('tfoot tr a').html(), 'Add row');
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Init formset table -- no add", function() {
|
|
||||||
var html = $('#formset');
|
|
||||||
var table = html.find('table');
|
|
||||||
|
|
||||||
horizon.formset_table.init('flavors', '', '');
|
|
||||||
equal(table.find('tfoot tr a').length, 0);
|
|
||||||
});
|
|
@ -1,11 +0,0 @@
|
|||||||
horizon.addInitFunction(function () {
|
|
||||||
module("Client-Side Templating (horizon.templates.js)");
|
|
||||||
|
|
||||||
test("Template Compilation", function () {
|
|
||||||
var size = 0;
|
|
||||||
angular.forEach(horizon.templates.compiled_templates, function () {
|
|
||||||
size = size + 1;
|
|
||||||
});
|
|
||||||
ok(size > 0, "Compiled templates list should not be empty.");
|
|
||||||
});
|
|
||||||
});
|
|
@ -40,10 +40,15 @@
|
|||||||
<!-- Magic Search library must be after magic-search override widget -->
|
<!-- Magic Search library must be after magic-search override widget -->
|
||||||
<script src="{{ STATIC_URL }}horizon/lib/magic_search/magic_search.js"></script>
|
<script src="{{ STATIC_URL }}horizon/lib/magic_search/magic_search.js"></script>
|
||||||
|
|
||||||
|
{% block source %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
<!-- test files - mock and spec -->
|
<!-- test files - mock and spec -->
|
||||||
{% for file in HORIZON_CONFIG.js_spec_files %}
|
{% block spec %}
|
||||||
<script src='{{ STATIC_URL }}{{ file }}'></script>
|
{% for file in HORIZON_CONFIG.js_spec_files %}
|
||||||
{% endfor %}
|
<script src='{{ STATIC_URL }}{{ file }}'></script>
|
||||||
|
{% endfor %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -1,31 +1,43 @@
|
|||||||
<!DOCTYPE html>
|
{% extends "horizon/jasmine/jasmine.html" %}
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<title>Horizon QUnit Test Suite</title>
|
|
||||||
<link rel="stylesheet" href="{{ STATIC_URL }}horizon/lib/qunit/qunit.css" type="text/css" media="screen">
|
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}horizon/lib/jquery/jquery.js"></script>
|
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}horizon/lib/qunit/qunit.js"></script>
|
|
||||||
{% include "horizon/_conf.html" %}
|
|
||||||
|
|
||||||
{% comment %}Load test modules here.{% endcomment %}
|
{% block source %}
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}horizon/tests/modals.js"></script>
|
<!-- Instead include all "horizon/_scripts.html" -->
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}horizon/tests/templates.js"></script>
|
{% include "horizon/_script_i18n.html" %}
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}horizon/tests/tables.js"></script>
|
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}horizon/tests/instances.js"></script>
|
|
||||||
{% comment %}End test modules.{% endcomment %}
|
|
||||||
|
|
||||||
{% include "horizon/_scripts.html" %}
|
<script src="{{ STATIC_URL }}bootstrap/js/bootstrap.js"></script>
|
||||||
</head>
|
<script src="{{ STATIC_URL }}horizon/lib/jquery/jquery.tablesorter.js"></script>
|
||||||
<body ng-app="hz">
|
<script src="{{ STATIC_URL }}horizon/lib/hogan.js"></script>
|
||||||
<h1 id="qunit-header">Horizon JavaScript Tests</h1>
|
<script src='{{ STATIC_URL }}horizon/lib/jsencrypt/jsencrypt.js'></script>
|
||||||
<h2 id="qunit-banner"></h2>
|
<script src="{{ STATIC_URL }}horizon/js/horizon.templates.js"></script>
|
||||||
<div id="qunit-testrunner-toolbar"></div>
|
<script src="{{ STATIC_URL }}horizon/js/horizon.instances.js"></script>
|
||||||
<h2 id="qunit-userAgent"></h2>
|
<script src='{{ STATIC_URL }}horizon/js/horizon.tabs.js'></script>
|
||||||
<ol id="qunit-tests"></ol>
|
<script src='{{ STATIC_URL }}horizon/js/horizon.forms.js'></script>
|
||||||
<div id="qunit-fixture">
|
<script src='{{ STATIC_URL }}horizon/js/horizon.formset_table.js'></script>
|
||||||
|
<script src='{{ STATIC_URL }}horizon/js/horizon.messages.js'></script>
|
||||||
|
<script src='{{ STATIC_URL }}horizon/js/horizon.modals.js'></script>
|
||||||
|
<script src='{{ STATIC_URL }}horizon/js/horizon.tables.js'></script>
|
||||||
|
|
||||||
|
{% include "horizon/client_side/templates.html" %}
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Call init on DOM ready.
|
||||||
|
$(document).ready(horizon.init);
|
||||||
|
</script>
|
||||||
|
<!-- The end -->
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block spec %}
|
||||||
|
<!-- test files -->
|
||||||
|
<script type="text/javascript" src="{{ STATIC_URL }}horizon/tests/jasmine/modals.legacy-spec.js"></script>
|
||||||
|
<script type="text/javascript" src="{{ STATIC_URL }}horizon/tests/jasmine/templates.legacy-spec.js"></script>
|
||||||
|
<script type="text/javascript" src="{{ STATIC_URL }}horizon/tests/jasmine/tables.legacy-spec.js"></script>
|
||||||
|
<script type="text/javascript" src="{{ STATIC_URL }}horizon/tests/jasmine/instances.legacy-spec.js"></script>
|
||||||
|
<script type="text/javascript" src="{{ STATIC_URL }}horizon/tests/jasmine/messages.legacy-spec.js"></script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div id="jasmine-fixture">
|
||||||
<!-- Test markup; will be hidden. -->
|
<!-- Test markup; will be hidden. -->
|
||||||
|
|
||||||
<div id="main_content">
|
<div id="main_content">
|
||||||
<div class="messages"></div>
|
<div class="messages"></div>
|
||||||
<div id="modal_wrapper"></div>
|
<div id="modal_wrapper"></div>
|
||||||
@ -55,9 +67,9 @@
|
|||||||
</div></th></tr></thead>
|
</div></th></tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr class="category-cat"><td>cat1</td></tr>
|
<tr class="category-cat"><td>cat1</td></tr>
|
||||||
<tr class="category-big category-dog"><td>dog1</td></tr>
|
<tr class="category-big category-dog" style="display: none"><td>dog1</td></tr>
|
||||||
<tr class="category-big category-cat"><td>cat2</td></tr>
|
<tr class="category-big category-cat" style="display: none"><td>cat2</td></tr>
|
||||||
<tr class="category-dog"><td>dog2</td></tr>
|
<tr class="category-dog" style="display: none"><td>dog2</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
<tr>
|
<tr>
|
||||||
@ -226,7 +238,6 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
{% endblock %}
|
||||||
</html>
|
|
@ -18,17 +18,16 @@ from horizon.test import helpers as test
|
|||||||
|
|
||||||
|
|
||||||
class BrowserTests(test.SeleniumTestCase):
|
class BrowserTests(test.SeleniumTestCase):
|
||||||
def test_qunit(self):
|
def test_jasmine_legacy(self):
|
||||||
self.selenium.get("%s%s" % (self.live_server_url, "/qunit/"))
|
self.selenium.get("%s%s" % (self.live_server_url,
|
||||||
wait = self.ui.WebDriverWait(self.selenium, 120)
|
"/jasmine-legacy/"))
|
||||||
|
wait = self.ui.WebDriverWait(self.selenium, 30)
|
||||||
|
|
||||||
def qunit_done(driver):
|
def jasmine_legacy_done(driver):
|
||||||
text = driver.find_element_by_id("qunit-testresult").text
|
failures = driver.find_element_by_class_name("bar").text
|
||||||
return "Tests completed" in text
|
return failures
|
||||||
|
|
||||||
wait.until(qunit_done)
|
self.assertTrue('0 failures' in wait.until(jasmine_legacy_done))
|
||||||
failed = self.selenium.find_element_by_class_name("failed")
|
|
||||||
self.assertEqual(int(failed.text), 0)
|
|
||||||
|
|
||||||
|
|
||||||
@override_settings(
|
@override_settings(
|
||||||
|
@ -37,10 +37,11 @@ urlpatterns = patterns(
|
|||||||
{'template_name': "auth/login.html"},
|
{'template_name': "auth/login.html"},
|
||||||
name='login'),
|
name='login'),
|
||||||
url(r'auth/', include('django.contrib.auth.urls')),
|
url(r'auth/', include('django.contrib.auth.urls')),
|
||||||
url(r'^qunit/$',
|
url(r'^jasmine/.*?$', jasmine.dispatcher),
|
||||||
TemplateView.as_view(template_name="horizon/qunit.html"),
|
url(r'^jasmine-legacy/$',
|
||||||
name='qunit_tests'),
|
TemplateView.as_view(
|
||||||
url(r'^jasmine/.*?$', jasmine.dispatcher)
|
template_name="horizon/jasmine/jasmine_legacy.html"),
|
||||||
|
name='jasmine_tests'),
|
||||||
)
|
)
|
||||||
|
|
||||||
urlpatterns += staticfiles_urlpatterns()
|
urlpatterns += staticfiles_urlpatterns()
|
||||||
|
@ -38,7 +38,6 @@ import xstatic.pkg.jquery_tablesorter
|
|||||||
import xstatic.pkg.jquery_ui
|
import xstatic.pkg.jquery_ui
|
||||||
import xstatic.pkg.jsencrypt
|
import xstatic.pkg.jsencrypt
|
||||||
import xstatic.pkg.magic_search
|
import xstatic.pkg.magic_search
|
||||||
import xstatic.pkg.qunit
|
|
||||||
import xstatic.pkg.rickshaw
|
import xstatic.pkg.rickshaw
|
||||||
import xstatic.pkg.spin
|
import xstatic.pkg.spin
|
||||||
import xstatic.pkg.termjs
|
import xstatic.pkg.termjs
|
||||||
@ -99,9 +98,6 @@ def get_staticfiles_dirs(webroot='/'):
|
|||||||
('horizon/lib/magic_search',
|
('horizon/lib/magic_search',
|
||||||
xstatic.main.XStatic(xstatic.pkg.magic_search,
|
xstatic.main.XStatic(xstatic.pkg.magic_search,
|
||||||
root_url=webroot).base_dir),
|
root_url=webroot).base_dir),
|
||||||
('horizon/lib/qunit',
|
|
||||||
xstatic.main.XStatic(xstatic.pkg.qunit,
|
|
||||||
root_url=webroot).base_dir),
|
|
||||||
('horizon/lib',
|
('horizon/lib',
|
||||||
xstatic.main.XStatic(xstatic.pkg.rickshaw,
|
xstatic.main.XStatic(xstatic.pkg.rickshaw,
|
||||||
root_url=webroot).base_dir),
|
root_url=webroot).base_dir),
|
||||||
|
@ -59,7 +59,6 @@ XStatic-JQuery.TableSorter>=2.14.5.1 # MIT License
|
|||||||
XStatic-jquery-ui>=1.10.1 # MIT License
|
XStatic-jquery-ui>=1.10.1 # MIT License
|
||||||
XStatic-JSEncrypt>=2.0.0.2 # MIT License
|
XStatic-JSEncrypt>=2.0.0.2 # MIT License
|
||||||
XStatic-Magic-Search>=0.2.5.1 # Apache 2.0 License
|
XStatic-Magic-Search>=0.2.5.1 # Apache 2.0 License
|
||||||
XStatic-QUnit>=1.14.0.2 # MIT License
|
|
||||||
XStatic-Rickshaw>=1.5.0 # BSD License (prior)
|
XStatic-Rickshaw>=1.5.0 # BSD License (prior)
|
||||||
XStatic-smart-table>=1.4.5.3 # MIT License
|
XStatic-smart-table>=1.4.5.3 # MIT License
|
||||||
XStatic-Spin>=1.2.5.2 # MIT License
|
XStatic-Spin>=1.2.5.2 # MIT License
|
||||||
|
Loading…
Reference in New Issue
Block a user