rank.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. import assert from 'assert';
  2. import moment from 'moment'; // jshint ignore:line
  3. import React from 'react'; // jshint ignore:line
  4. import ListLoading from 'misago/components/users/rank/list-loading' // jshint ignore:line
  5. import List from 'misago/components/users/rank/list' // jshint ignore:line
  6. import Pager from 'misago/components/users/rank/pager' // jshint ignore:line
  7. import Root from 'misago/components/users/rank/root'; // jshint ignore:line
  8. import misago from 'misago/index';
  9. import reducer from 'misago/reducers/users';
  10. import ajax from 'misago/services/ajax';
  11. import polls from 'misago/services/polls';
  12. import snackbar from 'misago/services/snackbar';
  13. import store from 'misago/services/store';
  14. import * as testUtils from 'misago/utils/test-utils';
  15. let snackbarStore = null;
  16. describe("Rank Users List", function() {
  17. afterEach(function() {
  18. testUtils.unmountComponents();
  19. });
  20. it("renders users", function(done) {
  21. /* jshint ignore:start */
  22. let users = [
  23. testUtils.mockUser({
  24. id: 123,
  25. title: "Lorem ipsum",
  26. status: {is_online: true},
  27. joined_on: moment()
  28. }),
  29. testUtils.mockUser({
  30. id: 122,
  31. status: {is_online: true},
  32. joined_on: moment()
  33. })
  34. ];
  35. let state = {
  36. count: 2,
  37. page: 1,
  38. pages: 2,
  39. page_range: [1, 2],
  40. first: 1,
  41. previous: null,
  42. next: 2,
  43. last: 2,
  44. before: 0,
  45. more: 1
  46. };
  47. testUtils.render(
  48. <List baseUrl='/users/'
  49. users={users}
  50. {...state} />
  51. );
  52. /* jshint ignore:end */
  53. testUtils.onElement('#test-mount .users-cards-list.ui-ready', function() {
  54. assert.ok(true, "component renders");
  55. assert.ok($('#test-mount .pager-undercontent').length,
  56. "paginator is rendered");
  57. assert.equal($('#test-mount .user-card').length, 2,
  58. "two users are rendered");
  59. done();
  60. });
  61. });
  62. });
  63. describe("Rank Users List Pager", function() {
  64. afterEach(function() {
  65. testUtils.unmountComponents();
  66. });
  67. it("renders", function(done) {
  68. /* jshint ignore:start */
  69. let state = {
  70. baseUrl: '/users/rank-slug/',
  71. count: 10,
  72. page: 2,
  73. pages: 3,
  74. page_range: [1, 2, 3],
  75. first: 1,
  76. previous: null,
  77. next: 3,
  78. last: 3,
  79. before: 10,
  80. more: 10
  81. };
  82. testUtils.render(
  83. <Pager {...state} />
  84. );
  85. /* jshint ignore:end */
  86. testUtils.onElement('#test-mount .pager-undercontent', function() {
  87. assert.ok(true, "component renders");
  88. assert.ok($('#test-mount .pager .previous').length, "prev page renders");
  89. assert.ok($('#test-mount .pager .next').length, "next page renders");
  90. assert.equal($('#test-mount .pager-progress-bar li').length, 3,
  91. "progress bar renders");
  92. assert.equal($('#test-mount .pager-progress-bar .active').text().trim(),
  93. '2',
  94. "valid page is active in progress bar");
  95. done();
  96. });
  97. });
  98. it("renders without next page", function(done) {
  99. /* jshint ignore:start */
  100. let state = {
  101. baseUrl: '/users/rank-slug/',
  102. count: 10,
  103. page: 3,
  104. pages: 3,
  105. page_range: [1, 2, 3],
  106. first: 1,
  107. previous: null,
  108. next: null,
  109. last: null,
  110. before: 10,
  111. more: 0
  112. };
  113. testUtils.render(
  114. <Pager {...state} />
  115. );
  116. /* jshint ignore:end */
  117. testUtils.onElement('#test-mount .pager-undercontent', function() {
  118. assert.ok(true, "component renders");
  119. assert.ok($('#test-mount .pager .previous').length, "prev page renders");
  120. assert.ok(!$('#test-mount .pager .next').length, "next not rendering");
  121. assert.equal($('#test-mount .pager-progress-bar li').length, 3,
  122. "progress bar renders");
  123. assert.equal($('#test-mount .pager-progress-bar .active').text().trim(),
  124. '3',
  125. "valid page is active in progress bar");
  126. done();
  127. });
  128. });
  129. it("renders without prev page", function(done) {
  130. /* jshint ignore:start */
  131. let state = {
  132. baseUrl: '/users/rank-slug/',
  133. count: 10,
  134. page: 1,
  135. pages: 3,
  136. page_range: [1, 2, 3],
  137. first: null,
  138. previous: null,
  139. next: 2,
  140. last: 3,
  141. before: 0,
  142. more: 10
  143. };
  144. testUtils.render(
  145. <Pager {...state} />
  146. );
  147. /* jshint ignore:end */
  148. testUtils.onElement('#test-mount .pager-undercontent', function() {
  149. assert.ok(true, "component renders");
  150. assert.ok(!$('#test-mount .pager .previous').length,
  151. "prev page is not rendering");
  152. assert.ok($('#test-mount .pager .next').length, "next page renders");
  153. assert.equal($('#test-mount .pager-progress-bar li').length, 3,
  154. "progress bar renders");
  155. assert.equal($('#test-mount .pager-progress-bar .active').text().trim(),
  156. '1',
  157. "valid page is active in progress bar");
  158. done();
  159. });
  160. });
  161. });
  162. describe("Rank Users List Loading", function() {
  163. afterEach(function() {
  164. testUtils.unmountComponents();
  165. });
  166. it("renders", function(done) {
  167. /* jshint ignore:start */
  168. testUtils.render(<ListLoading />);
  169. /* jshint ignore:end */
  170. testUtils.onElement('#test-mount .users-cards-list', function() {
  171. assert.ok(true, "component renders");
  172. done();
  173. });
  174. });
  175. });
  176. describe("Rank Users List Root", function() {
  177. beforeEach(function() {
  178. snackbarStore = testUtils.snackbarStoreMock();
  179. snackbar.init(snackbarStore);
  180. polls.init(ajax, snackbar);
  181. testUtils.contextGuest(misago);
  182. misago._context = Object.assign(misago._context, {
  183. USERS_LIST_URL: '/users/',
  184. USERS_API: '/test-api/users/',
  185. USERS_LISTS: [
  186. {
  187. component: "rank",
  188. id: 424,
  189. name: "Forum team",
  190. slug: 'forum-team',
  191. css_class: 'forum-team',
  192. description: {
  193. plain: "This is forum team rank.",
  194. html: "<p class=\"test-description\">This is forum team rank.</p>"
  195. }
  196. }
  197. ]
  198. });
  199. store.constructor();
  200. store.addReducer('users', reducer, []);
  201. store.addReducer('auth', function(state, action) {
  202. if (action || true) {
  203. return {};
  204. }
  205. }, {});
  206. store.addReducer('tick', function(state, action) {
  207. if (action || true) {
  208. return {'tick': 123};
  209. }
  210. }, {});
  211. store.init();
  212. });
  213. afterEach(function() {
  214. testUtils.unmountComponents();
  215. testUtils.snackbarClear(snackbar);
  216. $.mockjax.clear();
  217. });
  218. it("renders preloaded", function(done) {
  219. let data = {
  220. results: [
  221. testUtils.mockUser({
  222. id: 123,
  223. title: "Lorem ipsum",
  224. status: {is_online: true}
  225. }),
  226. testUtils.mockUser({
  227. id: 122,
  228. status: {is_online: true}
  229. })
  230. ],
  231. count: 10,
  232. page: 1,
  233. pages: 1,
  234. page_range: [1],
  235. first: null,
  236. previous: null,
  237. next: null,
  238. last: null,
  239. before: 0,
  240. more: 0
  241. };
  242. $.mockjax({
  243. url: '/test-api/users/?rank=424&page=1',
  244. status: 200,
  245. responseText: data
  246. });
  247. misago._context.USERS = data;
  248. /* jshint ignore:start */
  249. let rank = {
  250. id: 424,
  251. name: "Forum team",
  252. slug: 'forum-team',
  253. css_class: 'forum-team',
  254. description: {
  255. plain: "This is forum team rank.",
  256. html: "<p class=\"test-description\">This is forum team rank.</p>"
  257. }
  258. };
  259. testUtils.render(
  260. <Root user={misago._context.user}
  261. users={[]}
  262. tick={123}
  263. route={{rank: rank}}
  264. params={{}} />
  265. );
  266. /* jshint ignore:end */
  267. testUtils.onElement('#test-mount .users-cards-list.ui-ready', function() {
  268. assert.ok(true, "component renders");
  269. assert.equal($('#test-mount p.test-description').text().trim(),
  270. "This is forum team rank.",
  271. "rank description was displayed");
  272. done();
  273. });
  274. });
  275. it("loads", function(done) {
  276. let data = {
  277. results: [
  278. testUtils.mockUser({
  279. id: 123,
  280. title: "Lorem ipsum",
  281. status: {is_online: true}
  282. }),
  283. testUtils.mockUser({
  284. id: 122,
  285. status: {is_online: true}
  286. })
  287. ],
  288. count: 10,
  289. page: 1,
  290. pages: 1,
  291. page_range: [1],
  292. first: null,
  293. previous: null,
  294. next: null,
  295. last: null,
  296. before: 0,
  297. more: 0
  298. };
  299. $.mockjax({
  300. url: '/test-api/users/?rank=424&page=1',
  301. status: 200,
  302. responseText: data
  303. });
  304. /* jshint ignore:start */
  305. let rank = {
  306. id: 424,
  307. name: "Forum team",
  308. slug: 'forum-team',
  309. css_class: 'forum-team',
  310. description: {
  311. plain: "This is forum team rank.",
  312. html: "<p class=\"test-description\">This is forum team rank.</p>"
  313. }
  314. };
  315. testUtils.render(
  316. <Root user={misago._context.user}
  317. users={[]}
  318. tick={123}
  319. route={{rank: rank}}
  320. params={{}} />
  321. );
  322. /* jshint ignore:end */
  323. testUtils.onElement('#test-mount .users-cards-list.ui-ready', function() {
  324. assert.ok(true, "component renders");
  325. assert.equal($('#test-mount p.test-description').text().trim(),
  326. "This is forum team rank.",
  327. "rank description was displayed");
  328. done();
  329. });
  330. });
  331. it("handles backend error", function(done) {
  332. $.mockjax({
  333. url: '/test-api/users/?rank=424&page=1',
  334. status: 500
  335. });
  336. /* jshint ignore:start */
  337. let rank = {
  338. id: 424,
  339. name: "Forum team",
  340. slug: 'forum-team',
  341. css_class: 'forum-team',
  342. description: {
  343. plain: "This is forum team rank.",
  344. html: "<p class=\"test-description\">This is forum team rank.</p>"
  345. }
  346. };
  347. testUtils.render(
  348. <Root user={misago._context.user}
  349. users={[]}
  350. tick={123}
  351. route={{rank: rank}}
  352. params={{}} />
  353. );
  354. /* jshint ignore:end */
  355. snackbarStore.callback(function(message) {
  356. assert.deepEqual(message, {
  357. message: "Unknown error has occured.",
  358. type: 'error'
  359. }, "error message was shown");
  360. done();
  361. });
  362. });
  363. });