Browse Source

wip moderation forms tests

Rafał Pitoń 9 years ago
parent
commit
c855844864

+ 20 - 0
frontend/src/services/ajax.js

@@ -46,6 +46,16 @@ export class Ajax {
             rejection.detail = gettext("Lost connection with application.");
           }
 
+          if (rejection.status === 404) {
+            if (!rejection.detail || rejection.detail === 'NOT FOUND') {
+              rejection.detail = gettext("Action link is invalid.");
+            }
+          }
+
+          if (rejection.status === 500 && !rejection.detail) {
+            rejection.detail = gettext("Unknown error has occured.");
+          }
+
           rejection.statusText = jqXHR.statusText;
 
           reject(rejection);
@@ -116,6 +126,16 @@ export class Ajax {
             rejection.detail = gettext("Lost connection with application.");
           }
 
+          if (rejection.status === 404) {
+            if (!rejection.detail || rejection.detail === 'NOT FOUND') {
+              rejection.detail = gettext("Action link is invalid.");
+            }
+          }
+
+          if (rejection.status === 500 && !rejection.detail) {
+            rejection.detail = gettext("Unknown error has occured.");
+          }
+
           rejection.statusText = jqXHR.statusText;
 
           reject(rejection);

+ 8 - 16
frontend/src/services/snackbar.js

@@ -48,26 +48,18 @@ export class Snackbar {
   // shorthand for api errors
 
   apiError(rejection) {
-    let message = gettext("Unknown error has occured.");
+    let message = rejection.detail;
 
-    if (rejection.status === 0) {
-      message = rejection.detail;
-    }
-
-    if (rejection.status === 400 && rejection.detail) {
-      message = rejection.detail;
-    }
-
-    if (rejection.status === 403) {
-      message = rejection.detail;
-      if (message === "Permission denied") {
-        message = gettext(
-          "You don't have permission to perform this action.");
+    if (!message) {
+      if (rejection.status === 404) {
+        message = gettext("Action link is invalid.");
+      } else {
+        message = gettext("Unknown error has occured.");
       }
     }
 
-    if (rejection.status === 404) {
-      message = gettext("Action link is invalid.");
+    if (rejection.status === 403 && message === "Permission denied") {
+      message = gettext("You don't have permission to perform this action.");
     }
 
     this.error(message);

+ 89 - 0
frontend/tests/components/profile/moderation/avatar-controls.js

@@ -0,0 +1,89 @@
+import assert from 'assert';
+import React from 'react'; // jshint ignore:line
+import AvatarControls from 'misago/components/profile/moderation/avatar-controls'; // jshint ignore:line
+import snackbar from 'misago/services/snackbar';
+import * as testUtils from 'misago/utils/test-utils';
+
+let snackbarStore = null;
+let profileMock = {
+  is_followed: false,
+  followers: 0,
+
+  api_url: {
+    moderate_avatar: '/test-api/users/123/moderate_avatar/'
+  }
+};
+
+describe("User Profile Moderation Avatar Controls", function() {
+  beforeEach(function() {
+    snackbarStore = testUtils.snackbarStoreMock();
+    snackbar.init(snackbarStore);
+  });
+
+  afterEach(function() {
+    testUtils.unmountComponents();
+    testUtils.snackbarClear(snackbar);
+    $.mockjax.clear();
+  });
+
+  it("renders", function(done) {
+    $.mockjax({
+      url: profileMock.api_url.moderate_avatar,
+      status: 200,
+      responseText: {
+        is_avatar_locked: false,
+        avatar_lock_user_message: null,
+        avatar_lock_staff_message: null
+      }
+    });
+
+    /* jshint ignore:start */
+    testUtils.render(<AvatarControls profile={profileMock} />);
+    /* jshint ignore:end */
+
+    testUtils.onElement('#test-mount form', function(element) {
+      assert.ok(element.length, "component loads");
+
+      done();
+    });
+  });
+
+  it("handles backend error", function(done) {
+    $.mockjax({
+      url: profileMock.api_url.moderate_avatar,
+      status: 500
+    });
+
+    /* jshint ignore:start */
+    testUtils.render(<AvatarControls profile={profileMock} />);
+    /* 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.moderate_avatar,
+      status: 403,
+      responseText: {
+        detail: "You can't mod user avatar!"
+      }
+    });
+
+    /* jshint ignore:start */
+    testUtils.render(<AvatarControls profile={profileMock} />);
+    /* jshint ignore:end */
+
+    testUtils.onElement('#test-mount .modal-message', function(element) {
+      assert.equal(element.find('p.lead').text(), "You can't mod user avatar!",
+        "error message renders");
+
+      done();
+    });
+  });
+});

+ 0 - 0
frontend/tests/components/profile/moderation/change-username.js


+ 0 - 0
frontend/tests/components/profile/moderation/delete-account.js


+ 43 - 0
frontend/tests/components/profile/moderation/modal-message.js

@@ -0,0 +1,43 @@
+import assert from 'assert';
+import React from 'react'; // jshint ignore:line
+import ModalMessage from 'misago/components/profile/moderation/modal-message'; // jshint ignore:line
+import * as testUtils from 'misago/utils/test-utils';
+
+describe("User Profile Moderation Modal Message", function() {
+  afterEach(function() {
+    testUtils.unmountComponents();
+  });
+
+  it("renders", function() {
+    /* jshint ignore:start */
+    testUtils.render(<ModalMessage message="Lorem ipsum dolor met elit." />);
+    /* jshint ignore:end */
+
+    let element = $('#test-mount .modal-body');
+    assert.ok(element.length, "component renders");
+
+    assert.equal(element.find('.material-icon').text(), 'remove_circle_outline',
+      "component renders default icon");
+
+    assert.equal(element.find('p.lead').text(), "Lorem ipsum dolor met elit.",
+      "component renders specified message");
+  });
+
+  it("renders custom icon", function() {
+    /* jshint ignore:start */
+    testUtils.render(
+      <ModalMessage message="Lorem ipsum dolor met elit."
+                    icon="custom_icon" />
+    );
+    /* jshint ignore:end */
+
+    let element = $('#test-mount .modal-body');
+    assert.ok(element.length, "component renders");
+
+    assert.equal(element.find('.material-icon').text(), 'custom_icon',
+      "component renders custom icon");
+
+    assert.equal(element.find('p.lead').text(), "Lorem ipsum dolor met elit.",
+      "component renders specified message");
+  });
+});

+ 103 - 0
frontend/tests/components/profile/moderation/nav.js

@@ -0,0 +1,103 @@
+import assert from 'assert';
+import React from 'react'; // jshint ignore:line
+import Nav from 'misago/components/profile/moderation/nav'; // jshint ignore:line
+import * as testUtils from 'misago/utils/test-utils';
+
+let profileMock = null;
+
+describe("User Profile Moderation Menu", function() {
+  beforeEach(function() {
+    profileMock = {
+      acl: {
+        can_moderate_avatar: false,
+        can_rename: false,
+        can_delete: false
+      }
+    };
+  });
+
+  afterEach(function() {
+    testUtils.unmountComponents();
+  });
+
+  it("renders", function() {
+    /* jshint ignore:start */
+    testUtils.render(<Nav profile={profileMock} />);
+    /* jshint ignore:end */
+
+    let element = $('#test-mount .dropdown-menu');
+    assert.ok(element.length, "component renders");
+
+    assert.ok(!element.find('.btn-link').length,
+      "no moderation buttons are defautly displayed");
+  });
+
+  it("renders avatar moderation button", function() {
+    /* jshint ignore:start */
+    profileMock.acl.can_moderate_avatar = true;
+    testUtils.render(<Nav profile={profileMock} />);
+    /* jshint ignore:end */
+
+    let element = $('#test-mount .dropdown-menu');
+    assert.ok(element.length, "component renders");
+
+    assert.equal(element.find('.btn-link').length, 1,
+      "moderation button is displayed");
+
+    assert.equal(element.find('.btn-link .material-icon').text(), 'portrait',
+      "avatar moderation button has valid icon");
+    assert.ok(element.find('.btn-link').text().indexOf("Avatar controls") > 0,
+      "avatar moderation button has valid label");
+  });
+
+  it("renders username moderation button", function() {
+    /* jshint ignore:start */
+    profileMock.acl.can_rename = true;
+    testUtils.render(<Nav profile={profileMock} />);
+    /* jshint ignore:end */
+
+    let element = $('#test-mount .dropdown-menu');
+    assert.ok(element.length, "component renders");
+
+    assert.equal(element.find('.btn-link').length, 1,
+      "moderation button is displayed");
+
+    assert.equal(element.find('.btn-link .material-icon').text(), 'credit_card',
+      "username moderation button has valid icon");
+    assert.ok(element.find('.btn-link').text().indexOf("Change username") > 0,
+      "username moderation button has valid label");
+  });
+
+  it("renders delete button", function() {
+    /* jshint ignore:start */
+    profileMock.acl.can_delete = true;
+    testUtils.render(<Nav profile={profileMock} />);
+    /* jshint ignore:end */
+
+    let element = $('#test-mount .dropdown-menu');
+    assert.ok(element.length, "component renders");
+
+    assert.equal(element.find('.btn-link').length, 1,
+      "moderation button is displayed");
+
+    assert.equal(element.find('.btn-link .material-icon').text(), 'clear',
+      "delete user button has valid icon");
+    assert.ok(element.find('.btn-link').text().indexOf("Delete account") > 0,
+      "delete user button has valid label");
+  });
+
+  it("renders menu toggle", function(done) { // jshint ignore:line
+    /* jshint ignore:start */
+    let toggleNav = function() {
+      assert.ok(true, "callback was called!");
+      done();
+    }
+    testUtils.render(<Nav profile={profileMock} toggleNav={toggleNav} />);
+    /* jshint ignore:end */
+
+    let element = $('#test-mount .dropdown-menu');
+    assert.ok(element.length, "component renders");
+
+    testUtils.simulateClick('.btn-default');
+  });
+});

+ 1 - 1
frontend/tests/snackbar.js

@@ -149,7 +149,7 @@ describe("Snackbar", function() {
 
     assert.deepEqual(store.getState().snackbar, {
       type: 'error',
-      message: "Action link is invalid.",
+      message: "NOT FOUND",
       isVisible: true
     }, "service set not found message in store");
   });