root.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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. 'api_url': {
  56. 'avatar': '/test-api/users/123/avatar/'
  57. }
  58. }
  59. };
  60. });
  61. afterEach(function() {
  62. testUtils.unmountComponents();
  63. $.mockjax.clear();
  64. });
  65. it("loads successfully", function(done) {
  66. $.mockjax({
  67. url: '/test-api/users/123/avatar/',
  68. status: 200,
  69. responseText: apiResponse
  70. });
  71. /* jshint ignore:start */
  72. testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  73. /* jshint ignore:end */
  74. testUtils.onElement('#test-mount .modal-change-avatar', function() {
  75. assert.ok(true, "component renders");
  76. done();
  77. });
  78. });
  79. it("handles disconnection", function(done) {
  80. $.mockjax({
  81. url: '/test-api/users/123/avatar/',
  82. isTimeout: true
  83. });
  84. /* jshint ignore:start */
  85. testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  86. /* jshint ignore:end */
  87. testUtils.onElement('#test-mount .modal-message', function() {
  88. assert.equal(
  89. $('#test-mount .modal-message p.lead').text().trim(),
  90. "Lost connection with application.",
  91. "component renders error");
  92. done();
  93. });
  94. });
  95. it("handles rejection", function(done) {
  96. $.mockjax({
  97. url: '/test-api/users/123/avatar/',
  98. status: 400,
  99. responseText: {
  100. detail: "I can't let you do this Dave."
  101. }
  102. });
  103. /* jshint ignore:start */
  104. testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  105. /* jshint ignore:end */
  106. testUtils.onElement('#test-mount .modal-message', function() {
  107. assert.equal(
  108. $('#test-mount .modal-message p.lead').text().trim(),
  109. "I can't let you do this Dave.",
  110. "component renders error");
  111. done();
  112. });
  113. });
  114. it("handles rejection with reason", function(done) {
  115. $.mockjax({
  116. url: '/test-api/users/123/avatar/',
  117. status: 400,
  118. responseText: {
  119. detail: "Reasonable error.",
  120. reason: "<p class=\"reason\">I am the reason.</p>"
  121. }
  122. });
  123. /* jshint ignore:start */
  124. testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  125. /* jshint ignore:end */
  126. testUtils.onElement('#test-mount .modal-message', function() {
  127. assert.equal(
  128. $('#test-mount .modal-message p.lead').text().trim(),
  129. "Reasonable error.",
  130. "component renders error");
  131. assert.equal(
  132. $('#test-mount .modal-message p.reason').text().trim(),
  133. "I am the reason.",
  134. "component renders html reason");
  135. done();
  136. });
  137. });
  138. it("showError callback works", function(done) {
  139. $.mockjax({
  140. url: '/test-api/users/123/avatar/',
  141. status: 200,
  142. responseText: apiResponse
  143. });
  144. let component = null;
  145. /* jshint ignore:start */
  146. component = testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  147. /* jshint ignore:end */
  148. testUtils.onElement('#test-mount .modal-avatar-index', function() {
  149. component.showError({
  150. detail: "Callbacked error!",
  151. reason: "<p class=\"reason\">Callbacked html reason.</p>"
  152. });
  153. });
  154. testUtils.onElement('#test-mount .modal-message p.reason', function() {
  155. assert.equal(
  156. $('#test-mount .modal-message p.lead').text().trim(),
  157. "Callbacked error!",
  158. "component renders callbacked error message");
  159. assert.equal(
  160. $('#test-mount .modal-message p.reason').text().trim(),
  161. "Callbacked html reason.",
  162. "component renders callbacked html reason");
  163. done();
  164. });
  165. });
  166. it("switches to gallery and back", function(done) {
  167. $.mockjax({
  168. url: '/test-api/users/123/avatar/',
  169. status: 200,
  170. responseText: apiResponse
  171. });
  172. /* jshint ignore:start */
  173. testUtils.render(<ChangeAvatar user={misago.get('user')} />);
  174. /* jshint ignore:end */
  175. testUtils.onElement('#test-mount .btn-avatar-gallery', function() {
  176. testUtils.simulateClick('#test-mount .btn-avatar-gallery');
  177. });
  178. testUtils.onElement('#test-mount .modal-avatar-gallery', function() {
  179. assert.ok($('#test-mount .modal-avatar-gallery').length,
  180. "gallery was displayed via showGallery");
  181. testUtils.simulateClick('#test-mount .modal-footer .btn-default');
  182. testUtils.onElement('#test-mount .modal-avatar-index', function() {
  183. assert.ok(true, 'returned to index via showIndex');
  184. done();
  185. });
  186. });
  187. });
  188. });
  189. describe("Change Avatar Error", function() {
  190. afterEach(function() {
  191. testUtils.unmountComponents();
  192. });
  193. it('renders with message', function() {
  194. /* jshint ignore:start */
  195. testUtils.render(<ChangeAvatarError message="Lorem ipsum dolor met." />);
  196. /* jshint ignore:end */
  197. let element = $('#test-mount .modal-body');
  198. assert.ok(element.length, "component renders");
  199. assert.equal(element.find('p.lead').text().trim(), "Lorem ipsum dolor met.",
  200. "avatar change error renders message");
  201. });
  202. it('renders with html reason', function() {
  203. /* jshint ignore:start */
  204. let reason = "<p class=\"reason\">Here's the reason!</p>";
  205. testUtils.render(
  206. <ChangeAvatarError message="Lorem ipsum dolor met."
  207. reason={reason} />
  208. );
  209. /* jshint ignore:end */
  210. let element = $('#test-mount .modal-body');
  211. assert.ok(element.length, "component renders");
  212. assert.equal(element.find('p.lead').text().trim(), "Lorem ipsum dolor met.",
  213. "avatar change error renders message");
  214. assert.equal(element.find('p.reason').text().trim(), "Here's the reason!",
  215. "avatar change error renders reason html");
  216. });
  217. });