rank.js 11 KB

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