epam-ai-conductor 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/cli.js +4 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/content/{content/module-1/tests/Button.test.tsx → module-1/tests/Button.test.js} +8 -8
  4. package/dist/content/module-1/tests/CourseCard.test.js +68 -0
  5. package/dist/content/module-1/tests/CourseInfo.test.js +136 -0
  6. package/dist/content/module-1/tests/Courses.test.js +81 -0
  7. package/dist/content/{content/module-1/tests/Header.test.tsx → module-1/tests/Header.test.js} +5 -7
  8. package/dist/content/module-1/tests/Input.test.js +42 -0
  9. package/dist/content/module-1/tests/helpers.test.js +13 -0
  10. package/dist/content/module-2/tests/App.test.js +130 -0
  11. package/dist/content/module-2/tests/Button.test.js +22 -0
  12. package/dist/content/module-2/tests/CourseCard.test.js +93 -0
  13. package/dist/content/module-2/tests/CourseInfo.test.js +125 -0
  14. package/dist/content/module-2/tests/Courses.test.js +106 -0
  15. package/dist/content/module-2/tests/CreateCourse.test.js +117 -0
  16. package/dist/content/module-2/tests/Header.test.js +45 -0
  17. package/dist/content/module-2/tests/Input.test.js +42 -0
  18. package/dist/content/module-2/tests/Login.test.js +128 -0
  19. package/dist/content/module-2/tests/Registration.test.js +119 -0
  20. package/dist/content/module-2/tests/helpers.test.js +13 -0
  21. package/dist/content/module-2/tests/services.test.js +79 -0
  22. package/dist/content/module-3/tests/App.test.js +192 -0
  23. package/dist/content/{module-1/tests/Button.test.tsx → module-3/tests/Button.test.js} +8 -8
  24. package/dist/content/module-3/tests/CourseCard.test.js +50 -0
  25. package/dist/content/module-3/tests/CourseInfo.test.js +148 -0
  26. package/dist/content/module-3/tests/Courses.test.js +107 -0
  27. package/dist/content/module-3/tests/CreateAuthor.test.js +36 -0
  28. package/dist/content/module-3/tests/CreateCourse.test.js +66 -0
  29. package/dist/content/module-3/tests/Header.test.js +76 -0
  30. package/dist/content/module-3/tests/Input.test.js +42 -0
  31. package/dist/content/module-3/tests/Login.test.js +62 -0
  32. package/dist/content/{module-2/tests/Registration.test.tsx → module-3/tests/Registration.test.js} +13 -13
  33. package/dist/content/module-3/tests/helpers.test.js +13 -0
  34. package/dist/content/module-3/tests/services.test.js +83 -0
  35. package/dist/content/module-3/tests/slices.test.js +146 -0
  36. package/dist/content/module-4/tests/App.test.js +309 -0
  37. package/dist/content/module-4/tests/Button.test.js +22 -0
  38. package/dist/content/module-4/tests/CourseCard.test.js +111 -0
  39. package/dist/content/module-4/tests/CourseForm.test.js +108 -0
  40. package/dist/content/module-4/tests/CourseInfo.test.js +146 -0
  41. package/dist/content/module-4/tests/Courses.test.js +129 -0
  42. package/dist/content/module-4/tests/CreateAuthor.test.js +37 -0
  43. package/dist/content/module-4/tests/Header.test.js +79 -0
  44. package/dist/content/{content/module-1/tests/Input.test.tsx → module-4/tests/Input.test.js} +17 -11
  45. package/dist/content/module-4/tests/Login.test.js +61 -0
  46. package/dist/content/module-4/tests/PrivateRoute.test.js +45 -0
  47. package/dist/content/{content/module-2/tests/Registration.test.tsx → module-4/tests/Registration.test.js} +14 -13
  48. package/dist/content/module-4/tests/helpers.test.js +13 -0
  49. package/dist/content/module-4/tests/services.test.js +267 -0
  50. package/dist/content/module-4/tests/slices.test.js +146 -0
  51. package/dist/content/module-4/tests/thunk.test.js +238 -0
  52. package/dist/context-builder.js +20 -2
  53. package/dist/context-builder.js.map +1 -1
  54. package/dist/version-pin.d.ts +5 -0
  55. package/dist/version-pin.js +84 -0
  56. package/dist/version-pin.js.map +1 -0
  57. package/package.json +2 -2
  58. package/dist/content/content/module-1/task/module-1_home-task_components.md +0 -257
  59. package/dist/content/content/module-1/task/module-1_home-task_good_practices.md +0 -69
  60. package/dist/content/content/module-1/task/module-1_home-task_task.md +0 -253
  61. package/dist/content/content/module-1/tests/CourseCard.test.tsx +0 -64
  62. package/dist/content/content/module-1/tests/CourseInfo.test.tsx +0 -73
  63. package/dist/content/content/module-1/tests/Courses.test.tsx +0 -87
  64. package/dist/content/content/module-1/tests/helpers.test.ts +0 -13
  65. package/dist/content/content/module-1/theory/module-1_elements-render.md +0 -66
  66. package/dist/content/content/module-1/theory/module-1_hooks_useEffect.md +0 -178
  67. package/dist/content/content/module-1/theory/module-1_hooks_useState.md +0 -131
  68. package/dist/content/content/module-1/theory/module-1_react.md +0 -64
  69. package/dist/content/content/module-1/theory/module-1_spa.md +0 -74
  70. package/dist/content/content/module-2/task/module-2_home-task_components.md +0 -313
  71. package/dist/content/content/module-2/task/module-2_home-task_good_practices.md +0 -35
  72. package/dist/content/content/module-2/task/module-2_home-task_task.md +0 -210
  73. package/dist/content/content/module-2/tests/App.test.tsx +0 -54
  74. package/dist/content/content/module-2/tests/Login.test.tsx +0 -73
  75. package/dist/content/content/module-2/tests/SearchBar.test.tsx +0 -39
  76. package/dist/content/content/module-2/theory/module-2_custom-hooks.md +0 -201
  77. package/dist/content/content/module-2/theory/module-2_hooks.md +0 -117
  78. package/dist/content/content/module-2/theory/module-2_react-router.md +0 -328
  79. package/dist/content/content/module-3/task/module-3_home-task_components.md +0 -94
  80. package/dist/content/content/module-3/task/module-3_home-task_good_practices.md +0 -26
  81. package/dist/content/content/module-3/task/module-3_home-task_task.md +0 -170
  82. package/dist/content/content/module-3/tests/App.test.tsx +0 -54
  83. package/dist/content/content/module-3/tests/Courses.test.tsx +0 -87
  84. package/dist/content/content/module-3/tests/CreateAuthor.test.tsx +0 -44
  85. package/dist/content/content/module-3/tests/CreateCourse.test.tsx +0 -122
  86. package/dist/content/content/module-3/theory/module-3_redux-hooks.md +0 -194
  87. package/dist/content/content/module-3/theory/module-3_state-actions-reducers.md +0 -445
  88. package/dist/content/content/module-4/task/module-4_home-task_components.md +0 -187
  89. package/dist/content/content/module-4/task/module-4_home-task_task.md +0 -139
  90. package/dist/content/content/module-4/tests/App.test.tsx +0 -54
  91. package/dist/content/content/module-4/tests/Courses.test.tsx +0 -87
  92. package/dist/content/content/module-4/tests/CreateCourse.test.tsx +0 -122
  93. package/dist/content/content/module-4/tests/Login.test.tsx +0 -73
  94. package/dist/content/content/module-4/theory/module-4_async-redux.md +0 -99
  95. package/dist/content/content/module-4/theory/module-4_private-routes.md +0 -55
  96. package/dist/content/content/module-5/task/module-5_home-task_instruction.md +0 -68
  97. package/dist/content/content/module-5/task/module-5_home-task_task.md +0 -154
  98. package/dist/content/content/module-5/tests/App.test.tsx +0 -54
  99. package/dist/content/content/module-5/tests/CourseCard.test.tsx +0 -64
  100. package/dist/content/content/module-5/tests/Courses.test.tsx +0 -87
  101. package/dist/content/content/module-5/tests/Header.test.tsx +0 -23
  102. package/dist/content/content/module-5/theory/module-5_react-testing-library_example.md +0 -379
  103. package/dist/content/content/module-5/theory/module-5_redux-writing-tests.md +0 -246
  104. package/dist/content/module-1/tests/CourseCard.test.tsx +0 -64
  105. package/dist/content/module-1/tests/CourseInfo.test.tsx +0 -73
  106. package/dist/content/module-1/tests/Courses.test.tsx +0 -87
  107. package/dist/content/module-1/tests/Header.test.tsx +0 -23
  108. package/dist/content/module-1/tests/Input.test.tsx +0 -36
  109. package/dist/content/module-1/tests/helpers.test.ts +0 -13
  110. package/dist/content/module-2/tests/App.test.tsx +0 -54
  111. package/dist/content/module-2/tests/Login.test.tsx +0 -73
  112. package/dist/content/module-2/tests/SearchBar.test.tsx +0 -39
  113. package/dist/content/module-3/tests/App.test.tsx +0 -54
  114. package/dist/content/module-3/tests/Courses.test.tsx +0 -87
  115. package/dist/content/module-3/tests/CreateAuthor.test.tsx +0 -44
  116. package/dist/content/module-3/tests/CreateCourse.test.tsx +0 -122
  117. package/dist/content/module-4/tests/App.test.tsx +0 -54
  118. package/dist/content/module-4/tests/Courses.test.tsx +0 -87
  119. package/dist/content/module-4/tests/CreateCourse.test.tsx +0 -122
  120. package/dist/content/module-4/tests/Login.test.tsx +0 -73
  121. package/dist/content/module-5/tests/App.test.tsx +0 -54
  122. package/dist/content/module-5/tests/CourseCard.test.tsx +0 -64
  123. package/dist/content/module-5/tests/Courses.test.tsx +0 -87
  124. package/dist/content/module-5/tests/Header.test.tsx +0 -23
package/dist/cli.js CHANGED
@@ -9,6 +9,7 @@ import ora from 'ora';
9
9
  import inquirer from 'inquirer';
10
10
  import * as pty from 'node-pty';
11
11
  import { ensureAuth } from './auth-check.js';
12
+ import { ensureSupportedClaude } from './version-pin.js';
12
13
  import { buildContext, MODULE_TITLES } from './context-builder.js';
13
14
  import { TOTAL_MODULES } from './content-loader.js';
14
15
  import { startMcpServer } from './mcp-server.js';
@@ -126,6 +127,9 @@ program
126
127
  console.log(chalk.white(' Install it with:'), chalk.cyan('codemie install claude'));
127
128
  process.exit(1);
128
129
  }
130
+ // 3.5. Align Claude Code with the CodeMie-supported version (best-effort,
131
+ // avoids CodeMie's interactive version-mismatch menu mid-launch).
132
+ ensureSupportedClaude();
129
133
  // 4. Build context into target dir
130
134
  const spinner = ora(`Preparing Module ${moduleNum} mentor context...`).start();
131
135
  try {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAClF,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB;IAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB,EAAE,SAAiB,EAAE,QAAgB;IAC1E,MAAM,GAAG,GAAsB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElD,MAAM,YAAY,GAAG,2BAA2B,SAAS,oDAAoD,CAAC;IAE9G,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAEvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,EAAE;QACpF,IAAI,EAAE,aAAa;QACnB,IAAI;QACJ,IAAI;QACJ,GAAG,EAAE,SAAS;QACd,GAAG;KACJ,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,cAAc;IAC9B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,UAAU,SAAS,EAAE,CAAC;IACnE,MAAM,SAAS,GAAG,kBAAkB,SAAS,KAAK,QAAQ,EAAE,CAAC;IAE7D,MAAM,MAAM,GAAG,MAAM;QACnB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM;QAClD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM;QAC9G,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM;QACnF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM;QAC9G,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IAErD,mFAAmF;IACnF,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACpB,oEAAoE;QACpE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,kDAAkD;QAClD,IAAI,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,QAAQ,GAAG,IAAI,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,YAAY,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEnE,gCAAgC;IAChC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC/B,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC5B,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,2FAA2F,CAAC;KACxG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,uBAAuB,EAAE,qBAAqB,CAAC;KACtD,MAAM,CAAC,kBAAkB,EAAE,yDAAyD,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACpG,MAAM,CAAC,KAAK,EAAE,IAAsC,EAAE,EAAE;IACvD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAE3D,gBAAgB;IAChB,MAAM,UAAU,EAAE,CAAC;IAEnB,2BAA2B;IAC3B,IAAI,SAAiB,CAAC;IAEtB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC1C,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,yCAAyC;gBAClD,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;oBACxD,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE;oBACvB,KAAK,EAAE,CAAC,GAAG,CAAC;iBACb,CAAC,CAAC;gBACH,OAAO,EAAE,CAAC;aACX,CAAC,CAAC,CAAC;QACJ,SAAS,GAAG,QAAQ,CAAC;IACvB,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,aAAa,EAAE,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,aAAa,GAAG,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,uCAAuC;IACvC,MAAM,iBAAiB,GAAG,wBAAwB,EAAE,CAAC;IACrD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mCAAmC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,SAAS,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/E,IAAI,CAAC;QACH,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,CAAC,OAAO,CAAC,UAAU,SAAS,gBAAgB,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+CAA+C,SAAS,SAAS,CAAC,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+CAA+C,SAAS,kBAAkB,CAAC,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+CAA+C,SAAS,oBAAoB,CAAC,CAAC,CAAC;IACvG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,SAAS,qBAAqB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,wDAAwD;IACxD,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEvF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;IACrH,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACjH,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IACzH,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;IACtG,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,gEAAgE,CAAC;KAC7E,cAAc,CAAC,uBAAuB,EAAE,eAAe,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;IACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,22 @@
1
- import '@testing-library/jest-dom'
1
+ import "@testing-library/jest-dom";
2
2
  import { render, fireEvent, screen } from "@testing-library/react";
3
- import { Button } from "../common/Button/Button";
3
+ import { Button } from "../../common/Button";
4
4
 
5
- describe('Button component', () => {
6
- test("Should render button with provided label", () => {
5
+ describe("Button component", () => {
6
+ test("should render with provided `buttonText` prop value", () => {
7
7
  const handleClickMock = jest.fn();
8
- render(<Button buttonText='Hello' handleClick={handleClickMock}/>);
8
+ render(<Button buttonText="Hello" handleClick={handleClickMock} />);
9
9
  const buttonElement = screen.getByText("Hello");
10
10
 
11
11
  expect(buttonElement).toBeInTheDocument();
12
12
  });
13
13
 
14
- test("Should call provided callback", () => {
14
+ test("should call provided handleClick callback prop", () => {
15
15
  const handleClickMock = jest.fn();
16
- render(<Button handleClick={handleClickMock} buttonText='Click me'/>);
16
+ render(<Button handleClick={handleClickMock} buttonText="Click me" />);
17
17
  const buttonElement = screen.getByText("Click me");
18
18
 
19
19
  fireEvent.click(buttonElement);
20
20
  expect(handleClickMock).toHaveBeenCalledTimes(1);
21
21
  });
22
- })
22
+ });
@@ -0,0 +1,68 @@
1
+ import "@testing-library/jest-dom";
2
+ import { render, screen } from "@testing-library/react";
3
+ import { CourseCard } from "../../components/Courses/components/CourseCard/CourseCard";
4
+
5
+ describe("CourseCard component", () => {
6
+ const course = {
7
+ id: "1",
8
+ title: "Course Title",
9
+ description: "Course Description",
10
+ creationDate: "08/03/2021",
11
+ duration: 60,
12
+ authors: [
13
+ "27cc3006-e93a-4748-8ca8-73d06aa93b6d",
14
+ "f762978b-61eb-4096-812b-ebde22838167",
15
+ ],
16
+ };
17
+ const authorsList = [
18
+ { id: "df32994e-b23d-497c-9e4d-84e4dc02882f", name: "name1" },
19
+ { id: "27cc3006-e93a-4748-8ca8-73d06aa93b6d", name: "name2" },
20
+ { id: "f762978b-61eb-4096-812b-ebde22838167", name: "name3" },
21
+ ];
22
+
23
+ test("should render correct title from course prop", () => {
24
+ render(<CourseCard course={course} authorsList={authorsList} />);
25
+
26
+ const titleElement = screen.getByText("Course Title");
27
+
28
+ expect(titleElement).toBeInTheDocument();
29
+ });
30
+
31
+ test("should render correct description from course prop", () => {
32
+ render(<CourseCard course={course} authorsList={authorsList} />);
33
+ const descriptionElement = screen.getByText("Course Description");
34
+ expect(descriptionElement).toBeInTheDocument();
35
+ });
36
+
37
+ test("should render correct duration (use getCourseDuration e.g. duration: 60 => 01:00 hour)", () => {
38
+ render(<CourseCard course={course} authorsList={authorsList} />);
39
+
40
+ const durationElement = screen.getByText(/01:00 hour/);
41
+
42
+ expect(durationElement).toBeInTheDocument();
43
+ });
44
+
45
+ test("should render correct date (use formatCreationDate e.g. creationDate: 08/03/2021 => 08.03.2021)", () => {
46
+ render(<CourseCard course={course} authorsList={authorsList} />);
47
+
48
+ const creationDateElement = screen.getByText(/08.03.2021/);
49
+
50
+ expect(creationDateElement).toBeInTheDocument();
51
+ });
52
+
53
+ test("should render authors list (match data from props course.authors and authorsList)", () => {
54
+ render(<CourseCard course={course} authorsList={authorsList} />);
55
+
56
+ const creationDateElement = screen.getByText(/name2, name3/);
57
+
58
+ expect(creationDateElement).toBeInTheDocument();
59
+ });
60
+
61
+ test("should render 'SHOW COURSE' button", () => {
62
+ render(<CourseCard course={course} authorsList={authorsList} />);
63
+
64
+ const creationDateElement = screen.getByText(/Show course/i);
65
+
66
+ expect(creationDateElement).toBeInTheDocument();
67
+ });
68
+ });
@@ -0,0 +1,136 @@
1
+ import "@testing-library/jest-dom";
2
+ import { render, screen, fireEvent } from "@testing-library/react";
3
+ import { CourseInfo } from "../../components/CourseInfo";
4
+ import { formatCreationDate, getCourseDuration } from "../../helpers";
5
+
6
+ const mockedCoursesList = [
7
+ {
8
+ id: "1",
9
+ title: "Course 1",
10
+ description: "Course 1 description",
11
+ creationDate: "2022-01-01",
12
+ duration: 60,
13
+ authors: [
14
+ "27cc3006-e93a-4748-8ca8-73d06aa93b6d",
15
+ "f762978b-61eb-4096-812b-ebde22838167",
16
+ ],
17
+ },
18
+ {
19
+ id: "2",
20
+ title: "Course 2",
21
+ description: "Course 2 description",
22
+ creationDate: "2022-02-01",
23
+ duration: 90,
24
+ authors: ["df32994e-b23d-497c-9e4d-84e4dc02882f"],
25
+ },
26
+ ];
27
+ const authorsList = [
28
+ { id: "df32994e-b23d-497c-9e4d-84e4dc02882f", name: "name1" },
29
+ { id: "27cc3006-e93a-4748-8ca8-73d06aa93b6d", name: "name2" },
30
+ { id: "f762978b-61eb-4096-812b-ebde22838167", name: "name3" },
31
+ ];
32
+
33
+ describe("CourseInfo", () => {
34
+ test("should renders correct title (find correct course from coursesList based on showCourseId prop) ", () => {
35
+ render(
36
+ <CourseInfo
37
+ coursesList={mockedCoursesList}
38
+ authorsList={authorsList}
39
+ showCourseId="1"
40
+ />
41
+ );
42
+
43
+ const courseTitle = screen.getByRole("heading", { level: 1 });
44
+
45
+ expect(courseTitle.textContent).toBe("Course 1");
46
+ });
47
+
48
+ test("should renders correct description", () => {
49
+ render(
50
+ <CourseInfo
51
+ coursesList={mockedCoursesList}
52
+ authorsList={authorsList}
53
+ showCourseId="1"
54
+ />
55
+ );
56
+
57
+ const courseDescription = screen.getByText("Course 1 description");
58
+
59
+ expect(courseDescription).toBeInTheDocument();
60
+ });
61
+
62
+ test("should renders correct course duration (use getCourseDuration)", () => {
63
+ render(
64
+ <CourseInfo
65
+ coursesList={mockedCoursesList}
66
+ authorsList={authorsList}
67
+ showCourseId="1"
68
+ />
69
+ );
70
+
71
+ const courseDuration = screen.queryByText(getCourseDuration(60));
72
+
73
+ expect(courseDuration).toBeInTheDocument();
74
+ });
75
+
76
+ test("should renders correct course creation date (use formatCreationDate)", () => {
77
+ render(
78
+ <CourseInfo
79
+ coursesList={mockedCoursesList}
80
+ authorsList={authorsList}
81
+ showCourseId="1"
82
+ />
83
+ );
84
+
85
+ const courseCreationDate = screen.getByText(
86
+ formatCreationDate(mockedCoursesList[0].creationDate)
87
+ );
88
+ expect(courseCreationDate).toBeInTheDocument();
89
+ });
90
+
91
+ test("should renders correct course authors names (find a course in the coursesList and match data from course authors and authorsList prop)", () => {
92
+ render(
93
+ <CourseInfo
94
+ coursesList={mockedCoursesList}
95
+ authorsList={authorsList}
96
+ showCourseId="1"
97
+ />
98
+ );
99
+
100
+ const authorNames = screen
101
+ .getAllByRole("listitem")
102
+ .map((li) => li.textContent);
103
+
104
+ expect(authorNames).toEqual(["name2", "name3"]);
105
+ });
106
+
107
+ test("should render `BACK` button correctly", () => {
108
+ render(
109
+ <CourseInfo
110
+ coursesList={mockedCoursesList}
111
+ authorsList={authorsList}
112
+ showCourseId="1"
113
+ />
114
+ );
115
+
116
+ const backButton = screen.getByRole("button");
117
+
118
+ expect(backButton).toBeInTheDocument();
119
+ });
120
+
121
+ test("should call onBack handler on Back button click", () => {
122
+ const onBack = jest.fn();
123
+ render(
124
+ <CourseInfo
125
+ coursesList={mockedCoursesList}
126
+ authorsList={authorsList}
127
+ showCourseId="1"
128
+ onBack={onBack}
129
+ />
130
+ );
131
+
132
+ const backButton = screen.queryByText(/back/i);
133
+ fireEvent.click(backButton);
134
+ expect(onBack).toHaveBeenCalledTimes(1);
135
+ });
136
+ });
@@ -0,0 +1,81 @@
1
+ import "@testing-library/jest-dom";
2
+ import { render, screen } from "@testing-library/react";
3
+ import { Courses } from "../../components/Courses/Courses";
4
+
5
+ describe("Courses component", () => {
6
+ const mockedCoursesList = [
7
+ {
8
+ id: "1",
9
+ title: "Course 1",
10
+ description: "Course 1 description",
11
+ creationDate: "2022-01-01",
12
+ duration: 60,
13
+ authors: [
14
+ "27cc3006-e93a-4748-8ca8-73d06aa93b6d",
15
+ "f762978b-61eb-4096-812b-ebde22838167",
16
+ ],
17
+ },
18
+ {
19
+ id: "2",
20
+ title: "Course 2",
21
+ description: "Course 2 description",
22
+ creationDate: "2022-02-01",
23
+ duration: 90,
24
+ authors: ["df32994e-b23d-497c-9e4d-84e4dc02882f"],
25
+ },
26
+ ];
27
+ const authorsList = [
28
+ { id: "df32994e-b23d-497c-9e4d-84e4dc02882f", name: "name" },
29
+ { id: "27cc3006-e93a-4748-8ca8-73d06aa93b6d", name: "name" },
30
+ { id: "f762978b-61eb-4096-812b-ebde22838167", name: "name" },
31
+ ];
32
+ const onAddClick = jest.fn();
33
+
34
+ test("should render list of courses from coursesList prop", () => {
35
+ render(
36
+ <Courses
37
+ coursesList={mockedCoursesList}
38
+ authorsList={authorsList}
39
+ onAddClick={onAddClick}
40
+ handleShowCourse={(id) => {}}
41
+ />
42
+ );
43
+
44
+ const courseElements = screen.getAllByTestId("courseCard");
45
+
46
+ expect(courseElements[0]).toBeInTheDocument();
47
+ expect(courseElements).toHaveLength(2);
48
+ });
49
+
50
+ test("should render 'ADD NEW COURSE' button", () => {
51
+ render(
52
+ <Courses
53
+ coursesList={mockedCoursesList}
54
+ authorsList={authorsList}
55
+ onAddClick={onAddClick}
56
+ handleShowCourse={(id) => {}}
57
+ />
58
+ );
59
+
60
+ const button = screen.getByText(/Add new/i);
61
+
62
+ expect(button).toBeInTheDocument();
63
+ });
64
+
65
+ test("should render EmptycoursesList component if no courses (with 'Your List Is Empty' text and button with data-testid='addCourse')", () => {
66
+ render(
67
+ <Courses
68
+ coursesList={[]}
69
+ authorsList={authorsList}
70
+ onAddClick={onAddClick}
71
+ handleShowCourse={(id) => {}}
72
+ />
73
+ );
74
+
75
+ const emptyText = screen.queryByText(/Your List Is Empty/i);
76
+ const addButtonElement = screen.getByTestId("addCourse");
77
+
78
+ expect(emptyText).toBeInTheDocument();
79
+ expect(addButtonElement).toBeInTheDocument();
80
+ });
81
+ });
@@ -1,9 +1,9 @@
1
1
  import "@testing-library/jest-dom";
2
2
  import { render, screen } from "@testing-library/react";
3
- import { Header } from "../components/Header/Header";
3
+ import { Header } from "../../components/Header/Header";
4
4
 
5
- describe('Header component', () => {
6
- test("Should render logo", () => {
5
+ describe("Header component", () => {
6
+ test("should render logo (<img /> tag)", () => {
7
7
  render(<Header />);
8
8
 
9
9
  const imageElement = screen.getByRole("img");
@@ -11,13 +11,11 @@ describe('Header component', () => {
11
11
  expect(imageElement).toBeInTheDocument();
12
12
  });
13
13
 
14
- test("Should render logout button", () => {
14
+ test("should render logout button", () => {
15
15
  render(<Header />);
16
16
 
17
17
  const logoutButtonElement = screen.getByRole("button");
18
18
 
19
19
  expect(logoutButtonElement).toBeInTheDocument();
20
20
  });
21
- })
22
-
23
-
21
+ });
@@ -0,0 +1,42 @@
1
+ import "@testing-library/jest-dom";
2
+ import { render, fireEvent, screen } from "@testing-library/react";
3
+ import { Input } from "../../common/Input";
4
+
5
+ describe("Input component", () => {
6
+ const placeholderTextMock = "Enter a value";
7
+
8
+ test("should render input with provided labelText prop value", () => {
9
+ render(
10
+ <Input labelText="Test Input" placeholderText={placeholderTextMock} />
11
+ );
12
+
13
+ const inputElement = screen.getByLabelText("Test Input");
14
+ expect(inputElement).toBeInTheDocument();
15
+ });
16
+
17
+ test("should render input with provided placeholderText prop value", () => {
18
+ const { getByPlaceholderText } = render(
19
+ <Input labelText="Test Input" placeholderText={placeholderTextMock} />
20
+ );
21
+
22
+ expect(getByPlaceholderText(placeholderTextMock)).toBeInTheDocument();
23
+ });
24
+
25
+ test("should call provided callback for onChange event", () => {
26
+ const handleChange = jest.fn();
27
+
28
+ render(
29
+ <Input
30
+ labelText="Test Input"
31
+ onChange={handleChange}
32
+ placeholderText={placeholderTextMock}
33
+ />
34
+ );
35
+
36
+ const inputElement = screen.getByLabelText("Test Input");
37
+ fireEvent.change(inputElement, { target: { value: "Hello" } });
38
+
39
+ expect(handleChange).toHaveBeenCalledTimes(1);
40
+ expect(inputElement.value).toBe("Hello");
41
+ });
42
+ });
@@ -0,0 +1,13 @@
1
+ import { formatCreationDate, getCourseDuration } from "../../helpers";
2
+
3
+ test("formatCreationDate function returns formatted date", () => {
4
+ const date = "2022/01/01";
5
+ const formattedDate = formatCreationDate(date);
6
+ expect(formattedDate).toBe("2022.01.01");
7
+ });
8
+
9
+ test("getCourseDuration function returns formatted duration", () => {
10
+ expect(getCourseDuration(60)).toBe("01:00 hour");
11
+ expect(getCourseDuration(90)).toBe("01:30 hour");
12
+ expect(getCourseDuration(120)).toBe("02:00 hours");
13
+ });
@@ -0,0 +1,130 @@
1
+ import "@testing-library/jest-dom";
2
+ import { fireEvent, render, screen } from "@testing-library/react";
3
+ import { MemoryRouter } from "react-router-dom";
4
+ import App from "../../App";
5
+
6
+ describe("App", () => {
7
+ test('should render Login component when "token" is not present in localStorage and route "/"', () => {
8
+ localStorage.removeItem("token");
9
+ render(
10
+ <MemoryRouter initialEntries={["/"]}>
11
+ <App />
12
+ </MemoryRouter>
13
+ );
14
+
15
+ expect(
16
+ screen.getByText(/If you don't have an account you/i)
17
+ ).toBeInTheDocument();
18
+ });
19
+
20
+ test('should switch to registration page from login page on "Registration" link click', () => {
21
+ localStorage.removeItem("token");
22
+
23
+ render(
24
+ <MemoryRouter initialEntries={["/"]}>
25
+ <App />
26
+ </MemoryRouter>
27
+ );
28
+
29
+ expect(
30
+ screen.getByText(/If you don't have an account you/i)
31
+ ).toBeInTheDocument();
32
+
33
+ fireEvent.click(screen.getByText(/registration/i));
34
+
35
+ expect(screen.queryByText(/name/i)).toBeInTheDocument();
36
+ });
37
+
38
+ test('should render Registration component when route "/registration"', () => {
39
+ localStorage.removeItem("token");
40
+ render(
41
+ <MemoryRouter initialEntries={["/registration"]}>
42
+ <App />
43
+ </MemoryRouter>
44
+ );
45
+
46
+ expect(screen.queryByText(/name/i)).toBeInTheDocument();
47
+ expect(screen.queryByText(/email/i)).toBeInTheDocument();
48
+ expect(screen.queryByText(/password/i)).toBeInTheDocument();
49
+ });
50
+
51
+ test('should switch to login page from registration page on "Login" link click', () => {
52
+ localStorage.removeItem("token");
53
+ render(
54
+ <MemoryRouter initialEntries={["/registration"]}>
55
+ <App />
56
+ </MemoryRouter>
57
+ );
58
+
59
+ expect(screen.queryByText(/name/i)).toBeInTheDocument();
60
+ expect(screen.queryByText(/email/i)).toBeInTheDocument();
61
+ expect(screen.queryByText(/password/i)).toBeInTheDocument();
62
+
63
+ fireEvent.click(screen.getByRole("link", { name: /login/i }));
64
+
65
+ expect(screen.queryByText(/name/i)).not.toBeInTheDocument();
66
+ });
67
+
68
+ test('should render CourseCard components with data-testid="courseCard" when token is present in localStorage and route "/"', () => {
69
+ localStorage.setItem("token", "token");
70
+ render(
71
+ <MemoryRouter initialEntries={["/"]}>
72
+ <App />
73
+ </MemoryRouter>
74
+ );
75
+
76
+ const courseElements = screen.getAllByTestId("courseCard");
77
+
78
+ expect(courseElements[0]).toBeInTheDocument();
79
+ });
80
+
81
+ test('should render CourseForm component with "CREATE COURSE" button with data-testid="createCourseButton" if route "/courses/add"', () => {
82
+ render(
83
+ <MemoryRouter initialEntries={["/courses/add"]}>
84
+ <App />
85
+ </MemoryRouter>
86
+ );
87
+
88
+ expect(screen.getByTestId("createCourseButton")).toBeInTheDocument();
89
+ });
90
+
91
+ test('should render CourseInfo component with data-testid="courseInfo" when route "/courses/:courseId"', () => {
92
+ render(
93
+ <MemoryRouter
94
+ initialEntries={["/courses/de5aaa59-90f5-4dbc-b8a9-aaf205c551ba"]}
95
+ >
96
+ <App />
97
+ </MemoryRouter>
98
+ );
99
+
100
+ expect(screen.getByTestId("courseInfo")).toBeInTheDocument();
101
+ });
102
+
103
+ test('should render CourseInfo with data-testid="courseInfo" component after "SHOW COURSE" button click', () => {
104
+ render(
105
+ <MemoryRouter>
106
+ <App />
107
+ </MemoryRouter>
108
+ );
109
+
110
+ fireEvent.click(screen.queryAllByText(/show/i)[0]);
111
+
112
+ expect(screen.getByTestId("courseInfo")).toBeInTheDocument();
113
+ });
114
+
115
+ test('should render list of courses with data-testid="courseCard" after "BACK" button click on CourseInfo page', () => {
116
+ render(
117
+ <MemoryRouter>
118
+ <App />
119
+ </MemoryRouter>
120
+ );
121
+
122
+ fireEvent.click(screen.queryAllByText(/show/i)[0]);
123
+ expect(screen.getByTestId("courseInfo")).toBeInTheDocument();
124
+
125
+ fireEvent.click(screen.queryAllByText(/back/i)[0]);
126
+ expect(screen.getAllByTestId("courseCard").length).toBeGreaterThanOrEqual(
127
+ 1
128
+ );
129
+ });
130
+ });
@@ -0,0 +1,22 @@
1
+ import "@testing-library/jest-dom";
2
+ import { render, fireEvent, screen } from "@testing-library/react";
3
+ import { Button } from "../../common/Button";
4
+
5
+ describe("Button component", () => {
6
+ test("should render button with provided buttonText prop value", () => {
7
+ const handleClickMock = jest.fn();
8
+ render(<Button buttonText="Hello" handleClick={handleClickMock} />);
9
+ const buttonElement = screen.getByText("Hello");
10
+
11
+ expect(buttonElement).toBeInTheDocument();
12
+ });
13
+
14
+ test("should call provided handleClick callback prop", () => {
15
+ const handleClickMock = jest.fn();
16
+ render(<Button handleClick={handleClickMock} buttonText="Click me" />);
17
+ const buttonElement = screen.getByText("Click me");
18
+
19
+ fireEvent.click(buttonElement);
20
+ expect(handleClickMock).toHaveBeenCalledTimes(1);
21
+ });
22
+ });