import assert from 'assert'; import moment from 'moment'; // jshint ignore:line import React from 'react'; // jshint ignore:line import Root, { ChangeUsername, NoChangesLeft, ChangeUsernameLoading, UsernameHistory } from 'misago/components/options/change-username'; // jshint ignore:line import misago from 'misago/index'; import snackbar from 'misago/services/snackbar'; import store from 'misago/services/store'; import * as testUtils from 'misago/utils/test-utils'; let snackbarStore = null; let user = testUtils.mockUser(); user.acl.name_changes_expire = 2; describe("Change Username Form", function() { beforeEach(function() { snackbarStore = testUtils.snackbarStoreMock(); snackbar.init(snackbarStore); testUtils.initEmptyStore(store); }); afterEach(function() { testUtils.unmountComponents(); testUtils.snackbarClear(snackbar); $.mockjax.clear(); }); it("renders", function(done) { /* jshint ignore:start */ let options = { changes_left: 5, length_min: 3, length_max: 14, next_on: null }; testUtils.render( ); /* jshint ignore:end */ testUtils.onElement('#test-mount .form-horizontal', function() { assert.ok(true, "component renders"); assert.equal($('#test-mount form .help-block').text().trim(), "You can change your username 5 more times. Used changes redeem after 2 days.", "valid help text is displayed in form"); done(); }); }); it("handles empty submit", function(done) { /* jshint ignore:start */ let options = { changes_left: 5, length_min: 3, length_max: 14, next_on: null }; testUtils.render( ); /* jshint ignore:end */ snackbarStore.callback(function(message) { assert.deepEqual(message, { message: "This field is required.", type: 'error' }, "error message was shown"); done(); }); testUtils.onElement('#test-mount form', function() { testUtils.simulateSubmit('#test-mount form'); }); }); it("handles invalid submit", function(done) { /* jshint ignore:start */ let options = { changes_left: 5, length_min: 10, length_max: 14, next_on: null }; testUtils.render( ); /* jshint ignore:end */ snackbarStore.callback(function(message) { assert.deepEqual(message, { message: "Username must be at least 10 characters long.", type: 'error' }, "error message was shown"); done(); }); testUtils.onElement('#test-mount form', function() { testUtils.simulateChange('#test-mount form #id_username', 'NewName'); testUtils.simulateSubmit('#test-mount form'); }); }); it("handles backend rejection", function(done) { $.mockjax({ url: user.api_url.username, status: 400, responseText: { detail: "Lol nope!" } }); /* jshint ignore:start */ let options = { changes_left: 5, length_min: 3, length_max: 14, next_on: null }; testUtils.render( ); /* jshint ignore:end */ snackbarStore.callback(function(message) { assert.deepEqual(message, { message: "Lol nope!", type: 'error' }, "error message from backend was shown"); done(); }); testUtils.onElement('#test-mount form', function() { testUtils.simulateChange('#test-mount form #id_username', 'Newt'); testUtils.simulateSubmit('#test-mount form'); }); }); it("handles backend error", function(done) { $.mockjax({ url: user.api_url.username, status: 500 }); /* jshint ignore:start */ let options = { changes_left: 5, length_min: 3, length_max: 14, next_on: null }; testUtils.render( ); /* jshint ignore:end */ snackbarStore.callback(function(message) { assert.deepEqual(message, { message: "Unknown error has occured.", type: 'error' }, "error message from backend was shown"); done(); }); testUtils.onElement('#test-mount form', function() { testUtils.simulateChange('#test-mount form #id_username', 'Newt'); testUtils.simulateSubmit('#test-mount form'); }); }); it("handles successfull submission", function(done) { // jshint ignore:line $.mockjax({ url: user.api_url.username, status: 200, responseText: { username: 'Newt', slug: 'newt', options: { changes_left: 4, length_min: 3, length_max: 14, next_on: null } } }); /* jshint ignore:start */ let options = { changes_left: 5, length_min: 3, length_max: 14, next_on: null }; let callback = function(username, slug, options) { assert.equal(username, 'Newt', "new username is passed to callback"); assert.equal(slug, 'newt', "new slug is passed to callback"); assert.deepEqual(options, { changes_left: 4, length_min: 3, length_max: 14, next_on: null }, "new options are passed to callback"); done(); }; testUtils.render( ); /* jshint ignore:end */ testUtils.onElement('#test-mount form', function() { testUtils.simulateChange('#test-mount form #id_username', 'newt'); testUtils.simulateSubmit('#test-mount form'); }); }); }); describe("No Changes Left Message", function() { afterEach(function() { testUtils.unmountComponents(); }); it("renders", function(done) { /* jshint ignore:start */ let options = { changes_left: 5, length_min: 3, length_max: 14, next_on: null }; testUtils.render(); /* jshint ignore:end */ testUtils.onElement('#test-mount .panel-message-body', function() { assert.ok(true, "component renders"); assert.equal($('#test-mount .help-block').text().trim(), "You have used up available name changes.", "valid help text is displayed in message"); done(); }); }); it("renders with next change message", function(done) { /* jshint ignore:start */ let options = { changes_left: 5, length_min: 3, length_max: 14, next_on: moment().add(5, 'days') }; testUtils.render(); /* jshint ignore:end */ testUtils.onElement('#test-mount .panel-message-body', function() { assert.ok(true, "component renders"); assert.equal($('#test-mount .help-block').text().trim(), "You will be able to change your username in 5 days.", "valid help text is displayed in message"); done(); }); }); }); describe("Change Username Loading", function() { afterEach(function() { testUtils.unmountComponents(); }); it("renders", function(done) { /* jshint ignore:start */ testUtils.render(); /* jshint ignore:end */ testUtils.onElement('#test-mount .panel-body-loading', function() { assert.ok(true, "component renders"); done(); }); }); }); describe("Username History Changes List", function() { afterEach(function() { testUtils.unmountComponents(); }); it("renders preview", function(done) { /* jshint ignore:start */ testUtils.render(); /* jshint ignore:end */ testUtils.onElement('#test-mount .username-history.ui-preview', function() { assert.ok(true, "component renders"); done(); }); }); it("renders empty", function(done) { /* jshint ignore:start */ testUtils.render( ); /* jshint ignore:end */ testUtils.onElement('#test-mount .empty-message', function() { assert.equal($('.empty-message').text().trim(), "No name changes have been recorded for your account.", "component renders with message"); done(); }); }); it("renders with two changes", function(done) { /* jshint ignore:start */ let changes = [ { id: 27, changed_by: { id: 1, username: "rafalp", slug: "rafalp", avatar_hash: "5c6a04b4", absolute_url: "/user/rafalp-1/" }, changed_by_username: "rafalp", changed_on: moment(), new_username: "Newt", old_username: "LoremIpsum" }, { id: 26, changed_by: { id: 1, username: "rafalp", slug: "rafalp", avatar_hash: "5c6a04b4", absolute_url: "/user/rafalp-1/" }, changed_by_username: "rafalp", changed_on: moment(), new_username: "LoremIpsum", old_username: "BobBoberson" } ]; testUtils.render( ); /* jshint ignore:end */ testUtils.onElement('#test-mount .username-history.ui-ready', function() { assert.equal($('#test-mount .list-group-item').length, 2, "component renders with two items"); done(); }); }); }); describe("Change Username Integration", function() { beforeEach(function() { snackbarStore = testUtils.snackbarStoreMock(); snackbar.init(snackbarStore); testUtils.initEmptyStore(store); misago._context = { USERNAME_CHANGES_API: '/test-api/name-history/' }; }); afterEach(function() { testUtils.unmountComponents(); testUtils.snackbarClear(snackbar); $.mockjax.clear(); }); it("renders", function(done) { $.mockjax({ url: user.api_url.username, status: 200, responseText: { changes_left: 2, length_min: 3, length_max: 14, next_on: null } }); $.mockjax({ url: '/test-api/name-history/?user=' + user.id, status: 200, responseText: { results: [] } }); /* jshint ignore:start */ testUtils.render( ); /* jshint ignore:end */ testUtils.onElement('#test-mount .username-history.ui-ready', function() { assert.ok(true, "root component renders"); done(); }); }); it("renders with no changes left", function(done) { $.mockjax({ url: user.api_url.username, status: 200, responseText: { changes_left: 0, length_min: 3, length_max: 14, next_on: null } }); $.mockjax({ url: '/test-api/name-history/?user=' + user.id, status: 200, responseText: { results: [] } }); /* jshint ignore:start */ testUtils.render( ); /* jshint ignore:end */ testUtils.onElement('#test-mount .panel-message-body', function() { assert.ok(true, "root component renders"); assert.equal($('#test-mount .help-block').text().trim(), "You have used up available name changes.", "valid help text is displayed in message"); done(); }); }); it("handles username change", function(done) { $.mockjax({ url: user.api_url.username, status: 200, type: 'GET', responseText: { changes_left: 2, length_min: 3, length_max: 14, next_on: null } }); $.mockjax({ url: user.api_url.username, status: 200, type: 'POST', responseText: { username: 'Newt', slug: 'newt', options: { changes_left: 2, length_min: 3, length_max: 14, next_on: null } } }); $.mockjax({ url: '/test-api/name-history/?user=' + user.id, status: 200, responseText: { results: [] } }); /* jshint ignore:start */ testUtils.render( ); /* jshint ignore:end */ snackbarStore.callback(function(message) { assert.deepEqual(message, { message: "Your username has been changed successfully.", type: 'success' }, "error message was shown"); done(); }); testUtils.onElement('#test-mount form #id_username', function() { testUtils.simulateChange('#test-mount form #id_username', 'newt'); testUtils.simulateSubmit('#test-mount form'); }); }); });