import assert from 'assert'; import React from 'react'; // jshint ignore:line import DeleteAccount from 'misago/components/profile/moderation/delete-account'; // jshint ignore:line import polls from 'misago/services/polls'; import snackbar from 'misago/services/snackbar'; import * as testUtils from 'misago/utils/test-utils'; let component = null; let snackbarStore = null; let profileMock = { id: 242, avatar_hash: 'original_hash', username: "BobBoberson", is_followed: false, followers: 0, api_url: { delete: '/test-api/users/123/delete/' } }; describe("User Profile Deletion", function() { beforeEach(function() { component = null; snackbarStore = testUtils.snackbarStoreMock(); snackbar.init(snackbarStore); polls.init(); }); afterEach(function() { testUtils.unmountComponents(); testUtils.snackbarClear(snackbar); $.mockjax.clear(); }); it("renders", function(done) { $.mockjax({ url: profileMock.api_url.delete, status: 200, responseText: { detail: 'ok' } }); /* jshint ignore:start */ component = testUtils.render() /* jshint ignore:end */ testUtils.onElement('#test-mount form', function(element) { assert.ok(element.length, "component loads"); let btn = element.find('.btn-danger'); assert.equal(btn.text().indexOf("Please wait..."), 0, "countdown is displayed in button"); component.setState({ countdown: 0, confirm: true }); component.forceUpdate(function() { assert.equal(btn.text(), "Delete BobBoberson", "countdown ends"); done(); }); }); }); it("handles backend error", function(done) { $.mockjax({ url: profileMock.api_url.delete, status: 500 }); /* jshint ignore:start */ testUtils.render(); /* jshint ignore:end */ testUtils.onElement('#test-mount .modal-message', function(element) { assert.equal(element.find('p.lead').text(), "Unknown error has occured.", "error message renders"); done(); }); }); it("handles load rejection", function(done) { $.mockjax({ url: profileMock.api_url.delete, status: 403, responseText: { detail: "You can't nuke user!" } }); /* jshint ignore:start */ testUtils.render(); /* jshint ignore:end */ testUtils.onElement('#test-mount .modal-message', function(element) { assert.equal(element.find('p.lead').text(), "You can't nuke user!", "error message renders"); done(); }); }); it("handles failed submission", function(done) { $.mockjax({ url: profileMock.api_url.delete, type: 'GET', status: 200, responseText: { detail: 'ok' } }); $.mockjax({ url: profileMock.api_url.delete, type: 'POST', status: 400, responseText: { detail: "Can't do it now!" } }); /* jshint ignore:start */ component = testUtils.render() /* jshint ignore:end */ snackbarStore.callback(function(message) { assert.equal(message.message, "Can't do it now!", "Rejection message is shown in snackbar."); done(); }); testUtils.onElement('#test-mount form', function() { component.setState({ countdown: 0, confirm: true }); component.forceUpdate(function() { testUtils.simulateSubmit('#test-mount form'); }); }); }); it("delets account without content", function(done) { $.mockjax({ url: profileMock.api_url.delete, type: 'GET', status: 200, responseText: { detail: 'ok' } }); $.mockjax({ url: profileMock.api_url.delete, type: 'POST', status: 200, responseText: { detail: 'ok' } }); /* jshint ignore:start */ component = testUtils.render(); /* jshint ignore:end */ testUtils.onElement('#test-mount form', function() { component.setState({ countdown: 0, confirm: true }); component.forceUpdate(function() { testUtils.simulateSubmit('#test-mount form'); }); testUtils.onElement('#test-mount .modal-message', function(element) { assert.equal(element.find('p.lead').text(), "BobBoberson's account has been deleted and other content has been hidden.", "valid account deletion message was displayed"); done(); }); }); }); it("delets account with content", function(done) { $.mockjax({ url: profileMock.api_url.delete, type: 'GET', status: 200, responseText: { detail: 'ok' } }); $.mockjax({ url: profileMock.api_url.delete, type: 'POST', status: 200, responseText: { detail: 'ok' } }); /* jshint ignore:start */ component = testUtils.render(); /* jshint ignore:end */ testUtils.onElement('#test-mount form', function() { component.setState({ countdown: 0, confirm: true, with_content: true }); component.forceUpdate(function() { testUtils.simulateSubmit('#test-mount form'); }); testUtils.onElement('#test-mount .modal-message', function(element) { assert.equal(element.find('p.lead').text(), "BobBoberson's account, threads, posts and other content has been deleted.", "valid account deletion message was displayed"); done(); }); }); }); });