active-posters.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. import assert from 'assert';
  2. import React from 'react'; // jshint ignore:line
  3. import Root, { ActivePosters, ActivePoster, ActivePostersLoading, NoActivePosters } from 'misago/components/users/active-posters'; // jshint ignore:line
  4. import misago from 'misago/index';
  5. import reducer from 'misago/reducers/users';
  6. import ajax from 'misago/services/ajax';
  7. import polls from 'misago/services/polls';
  8. import snackbar from 'misago/services/snackbar';
  9. import store from 'misago/services/store';
  10. import * as testUtils from 'misago/utils/test-utils';
  11. let snackbarStore = null;
  12. describe("Active Posters List", function() {
  13. afterEach(function() {
  14. testUtils.unmountComponents();
  15. });
  16. it("renders users", function(done) {
  17. /* jshint ignore:start */
  18. let users = [
  19. testUtils.mockUser({
  20. id: 123,
  21. meta: {score: 42},
  22. title: "Lorem ipsum",
  23. status: {is_online: true}
  24. }),
  25. testUtils.mockUser({
  26. id: 122,
  27. meta: {score: 36},
  28. status: {is_online: true}
  29. })
  30. ];
  31. testUtils.render(
  32. <ActivePosters users={users}
  33. trackedPeriod={30}
  34. count={2} />
  35. );
  36. /* jshint ignore:end */
  37. testUtils.onElement('#test-mount .active-posters.ui-ready', function() {
  38. assert.ok(true, "component renders");
  39. assert.equal($('#test-mount p.lead').text().trim(),
  40. "2 most active posters from last 30 days.",
  41. "lead message was displayed");
  42. assert.equal($('#test-mount .list-group-item').length, 2,
  43. "two users are rendered");
  44. done();
  45. });
  46. });
  47. });
  48. describe("Active Poster", function() {
  49. afterEach(function() {
  50. testUtils.unmountComponents();
  51. });
  52. it("renders with ui-preview", function(done) {
  53. let user = testUtils.mockUser();
  54. user.meta = {score: 42};
  55. user.title = "Lorem ipsum";
  56. /* jshint ignore:start */
  57. testUtils.render(
  58. <ActivePoster user={user} rank={user.rank} />
  59. );
  60. /* jshint ignore:end */
  61. testUtils.onElement('#test-mount .list-group-item', function() {
  62. assert.ok(true, "component renders");
  63. assert.ok($('#test-mount .status-icon.ui-preview').length,
  64. "status preview is rendered");
  65. assert.equal($('#test-mount .rank-name').text().trim(), user.rank.name,
  66. "rank name is rendered");
  67. assert.equal($('#test-mount .user-title').text().trim(), user.title,
  68. "user title is rendered");
  69. assert.equal($('#test-mount .rank-posts-counted .stat-value').text(), 42,
  70. "user score is rendered");
  71. done();
  72. });
  73. });
  74. it("renders", function(done) {
  75. let user = testUtils.mockUser();
  76. user.meta = {score: 42};
  77. user.title = "Lorem ipsum";
  78. user.status = {is_online: true};
  79. /* jshint ignore:start */
  80. testUtils.render(
  81. <ActivePoster user={user} rank={user.rank} />
  82. );
  83. /* jshint ignore:end */
  84. testUtils.onElement('#test-mount .list-group-item', function() {
  85. assert.ok(true, "component renders");
  86. assert.equal($('#test-mount .status-icon').text().trim(), 'lens',
  87. "status icon is rendered");
  88. assert.equal($('#test-mount .status-label').text().trim(), 'Online',
  89. "status label is rendered");
  90. assert.equal($('#test-mount .rank-name').text().trim(), user.rank.name,
  91. "rank name is rendered");
  92. assert.equal($('#test-mount .user-title').text().trim(), user.title,
  93. "user title is rendered");
  94. assert.equal($('#test-mount .rank-posts-counted .stat-value').text(), 42,
  95. "user score is rendered");
  96. done();
  97. });
  98. });
  99. });
  100. describe("Active Posters Loading", function() {
  101. afterEach(function() {
  102. testUtils.unmountComponents();
  103. });
  104. it("renders", function(done) {
  105. /* jshint ignore:start */
  106. testUtils.render(<ActivePostersLoading />);
  107. /* jshint ignore:end */
  108. testUtils.onElement('#test-mount .active-posters.ui-preview', function() {
  109. assert.ok(true, "component renders");
  110. done();
  111. });
  112. });
  113. });
  114. describe("No Active Posters", function() {
  115. afterEach(function() {
  116. testUtils.unmountComponents();
  117. });
  118. it("renders", function(done) {
  119. /* jshint ignore:start */
  120. testUtils.render(<NoActivePosters trackedPeriod="30" />);
  121. /* jshint ignore:end */
  122. testUtils.onElement('#test-mount .active-posters-list p.lead', function() {
  123. assert.ok(true, "component renders");
  124. assert.equal($('#test-mount p.lead').text().trim(),
  125. "No users have posted any new messages during last 30 days.",
  126. "valid empty message was displayed");
  127. done();
  128. });
  129. });
  130. });
  131. describe("Active Posters Root", function() {
  132. beforeEach(function() {
  133. snackbarStore = testUtils.snackbarStoreMock();
  134. snackbar.init(snackbarStore);
  135. polls.init(ajax, snackbar);
  136. testUtils.contextGuest(misago);
  137. misago._context = Object.assign(misago._context, {
  138. USERS_LIST_URL: '/users/',
  139. USERS_API: '/test-api/users/',
  140. USERS_LISTS: [
  141. {
  142. component: "active-posters",
  143. name: "Active posters"
  144. }
  145. ]
  146. });
  147. store.constructor();
  148. store.addReducer('users', reducer, []);
  149. store.addReducer('auth', function(state, action) {
  150. if (action || true) {
  151. return {};
  152. }
  153. }, {});
  154. store.addReducer('tick', function(state, action) {
  155. if (action || true) {
  156. return {'tick': 123};
  157. }
  158. }, {});
  159. store.init();
  160. });
  161. afterEach(function() {
  162. testUtils.unmountComponents();
  163. testUtils.snackbarClear(snackbar);
  164. $.mockjax.clear();
  165. });
  166. it("renders preloaded", function(done) {
  167. let data = {
  168. results: [
  169. testUtils.mockUser({
  170. id: 123,
  171. meta: {score: 42},
  172. title: "Lorem ipsum",
  173. status: {is_online: true}
  174. }),
  175. testUtils.mockUser({
  176. id: 122,
  177. meta: {score: 36},
  178. status: {is_online: true}
  179. })
  180. ],
  181. tracked_period: 30,
  182. count: 2
  183. };
  184. $.mockjax({
  185. url: '/test-api/users/?list=active',
  186. status: 200,
  187. responseText: data
  188. });
  189. misago._context.USERS = data;
  190. /* jshint ignore:start */
  191. testUtils.render(
  192. <Root user={misago._context.user}
  193. users={data.results}
  194. tick={123}
  195. route={{extra: {name: "Active posters"}}} />
  196. );
  197. /* jshint ignore:end */
  198. testUtils.onElement('#test-mount .active-posters.ui-ready', function() {
  199. assert.ok(true, "component renders");
  200. done();
  201. });
  202. });
  203. it("loads", function(done) {
  204. let data = {
  205. results: [
  206. testUtils.mockUser({
  207. id: 123,
  208. meta: {score: 42},
  209. title: "Lorem ipsum",
  210. status: {is_online: true}
  211. }),
  212. testUtils.mockUser({
  213. id: 122,
  214. meta: {score: 36},
  215. status: {is_online: true}
  216. })
  217. ],
  218. tracked_period: 30,
  219. count: 2
  220. };
  221. $.mockjax({
  222. url: '/test-api/users/?list=active',
  223. status: 200,
  224. responseText: data
  225. });
  226. misago._context.USERS = data;
  227. /* jshint ignore:start */
  228. testUtils.render(
  229. <Root user={misago._context.user}
  230. users={[]}
  231. tick={123}
  232. route={{extra: {name: "Active posters"}}} />
  233. );
  234. /* jshint ignore:end */
  235. testUtils.onElement('#test-mount .active-posters.ui-ready', function() {
  236. assert.ok(true, "component renders");
  237. done();
  238. });
  239. });
  240. it("handles backend error", function(done) {
  241. $.mockjax({
  242. url: '/test-api/users/?list=active',
  243. status: 500
  244. });
  245. /* jshint ignore:start */
  246. testUtils.render(
  247. <Root user={misago._context.user}
  248. users={[]}
  249. tick={123}
  250. route={{extra: {name: "Active posters"}}} />
  251. );
  252. /* jshint ignore:end */
  253. snackbarStore.callback(function(message) {
  254. assert.deepEqual(message, {
  255. message: "Unknown error has occured.",
  256. type: 'error'
  257. }, "error message was shown");
  258. done();
  259. });
  260. });
  261. });