root.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. import assert from 'assert';
  2. import React from 'react'; // jshint ignore:line
  3. import ChangeAvatar, { ChangeAvatarError } from 'misago/components/change-avatar/root'; // jshint ignore:line
  4. import misago from 'misago/index';
  5. import * as testUtils from 'misago/utils/test-utils';
  6. let apiResponse = {
  7. "crop_tmp": false,
  8. "galleries": [
  9. {
  10. "images": [
  11. "avatars/Nature/arctic_fox.jpg",
  12. "avatars/Nature/baby_fox.jpg",
  13. "avatars/Nature/blackbird.jpg",
  14. "avatars/Nature/rabbit.jpg",
  15. "avatars/Nature/serval.jpg"
  16. ],
  17. "name": "Nature"
  18. },
  19. {
  20. "images": [
  21. "avatars/Space/andromeda.jpg",
  22. "avatars/Space/antennae_galaxies.jpg",
  23. "avatars/Space/barred_spiral_galaxy.jpg",
  24. "avatars/Space/messier_74.jpg",
  25. "avatars/Space/ngc_1672.jpg",
  26. "avatars/Space/ngc_4414.jpg"
  27. ],
  28. "name": "Space"
  29. }
  30. ],
  31. "crop_org": false,
  32. "upload": {
  33. "allowed_extensions": [
  34. ".gif",
  35. ".png",
  36. ".jpg",
  37. ".jpeg"
  38. ],
  39. "limit": 750000,
  40. "allowed_mime_types": [
  41. "image/gif",
  42. "image/jpeg",
  43. "image/png"
  44. ]
  45. },
  46. "generated": true,
  47. "gravatar": true
  48. };
  49. describe("Change Avatar", function() {
  50. beforeEach(function() {
  51. misago._context = {
  52. 'user': {
  53. 'id': 123,
  54. 'avatar_hash': 'aabbccdd',
  55. 'avatar_api_url': '/test-api/users/123/avatar/'
  56. }
  57. };
  58. });
  59. afterEach(function() {
  60. testUtils.unmountComponents();
  61. $.mockjax.clear();
  62. });
  63. it("loads successfully", function(done) {
  64. $.mockjax({
  65. url: '/test-api/users/123/avatar/',
  66. status: 200,
  67. responseText: apiResponse
  68. });
  69. /* jshint ignore:start */
  70. testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  71. /* jshint ignore:end */
  72. testUtils.onElement('#test-mount .modal-change-avatar', function() {
  73. assert.ok(true, "component renders");
  74. done();
  75. });
  76. });
  77. it("handles disconnection", function(done) {
  78. $.mockjax({
  79. url: '/test-api/users/123/avatar/',
  80. isTimeout: true
  81. });
  82. /* jshint ignore:start */
  83. testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  84. /* jshint ignore:end */
  85. testUtils.onElement('#test-mount .modal-message', function() {
  86. assert.equal(
  87. $('#test-mount .modal-message p.lead').text().trim(),
  88. "Lost connection with application.",
  89. "component renders error");
  90. done();
  91. });
  92. });
  93. it("handles rejection", function(done) {
  94. $.mockjax({
  95. url: '/test-api/users/123/avatar/',
  96. status: 400,
  97. responseText: {
  98. detail: "I can't let you do this Dave."
  99. }
  100. });
  101. /* jshint ignore:start */
  102. testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  103. /* jshint ignore:end */
  104. testUtils.onElement('#test-mount .modal-message', function() {
  105. assert.equal(
  106. $('#test-mount .modal-message p.lead').text().trim(),
  107. "I can't let you do this Dave.",
  108. "component renders error");
  109. done();
  110. });
  111. });
  112. it("handles rejection with reason", function(done) {
  113. $.mockjax({
  114. url: '/test-api/users/123/avatar/',
  115. status: 400,
  116. responseText: {
  117. detail: "Reasonable error.",
  118. reason: "<p class=\"reason\">I am the reason.</p>"
  119. }
  120. });
  121. /* jshint ignore:start */
  122. testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  123. /* jshint ignore:end */
  124. testUtils.onElement('#test-mount .modal-message', function() {
  125. assert.equal(
  126. $('#test-mount .modal-message p.lead').text().trim(),
  127. "Reasonable error.",
  128. "component renders error");
  129. assert.equal(
  130. $('#test-mount .modal-message p.reason').text().trim(),
  131. "I am the reason.",
  132. "component renders html reason");
  133. done();
  134. });
  135. });
  136. it("showError callback works", function(done) {
  137. $.mockjax({
  138. url: '/test-api/users/123/avatar/',
  139. status: 200,
  140. responseText: apiResponse
  141. });
  142. let component = null;
  143. /* jshint ignore:start */
  144. component = testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  145. /* jshint ignore:end */
  146. testUtils.onElement('#test-mount .modal-avatar-index', function() {
  147. component.showError({
  148. detail: "Callbacked error!",
  149. reason: "<p class=\"reason\">Callbacked html reason.</p>"
  150. });
  151. });
  152. testUtils.onElement('#test-mount .modal-message p.reason', function() {
  153. assert.equal(
  154. $('#test-mount .modal-message p.lead').text().trim(),
  155. "Callbacked error!",
  156. "component renders callbacked error message");
  157. assert.equal(
  158. $('#test-mount .modal-message p.reason').text().trim(),
  159. "Callbacked html reason.",
  160. "component renders callbacked html reason");
  161. done();
  162. });
  163. });
  164. it("switches to gallery and back", function(done) {
  165. $.mockjax({
  166. url: '/test-api/users/123/avatar/',
  167. status: 200,
  168. responseText: apiResponse
  169. });
  170. /* jshint ignore:start */
  171. testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  172. /* jshint ignore:end */
  173. testUtils.onElement('#test-mount .btn-avatar-gallery', function() {
  174. testUtils.simulateClick('#test-mount .btn-avatar-gallery');
  175. });
  176. testUtils.onElement('#test-mount .modal-avatar-gallery', function() {
  177. assert.ok($('#test-mount .modal-avatar-gallery').length,
  178. "gallery was displayed via showGallery");
  179. testUtils.simulateClick('#test-mount .modal-footer .btn-default');
  180. testUtils.onElement('#test-mount .modal-avatar-index', function() {
  181. assert.ok(true, 'returned to index via showIndex');
  182. done();
  183. });
  184. });
  185. });
  186. });
  187. describe("Change Avatar Error", function() {
  188. afterEach(function() {
  189. testUtils.unmountComponents();
  190. });
  191. it('renders with message', function() {
  192. /* jshint ignore:start */
  193. testUtils.render(<ChangeAvatarError message="Lorem ipsum dolor met." />);
  194. /* jshint ignore:end */
  195. let element = $('#test-mount .modal-body');
  196. assert.ok(element.length, "component renders");
  197. assert.equal(element.find('p.lead').text().trim(), "Lorem ipsum dolor met.",
  198. "avatar change error renders message");
  199. });
  200. it('renders with html reason', function() {
  201. /* jshint ignore:start */
  202. let reason = "<p class=\"reason\">Here's the reason!</p>";
  203. testUtils.render(
  204. <ChangeAvatarError message="Lorem ipsum dolor met."
  205. reason={reason} />
  206. );
  207. /* jshint ignore:end */
  208. let element = $('#test-mount .modal-body');
  209. assert.ok(element.length, "component renders");
  210. assert.equal(element.find('p.lead').text().trim(), "Lorem ipsum dolor met.",
  211. "avatar change error renders message");
  212. assert.equal(element.find('p.reason').text().trim(), "Here's the reason!",
  213. "avatar change error renders reason html");
  214. });
  215. });