jinda 0.7.7.4 → 1.0.0

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 (311) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +46 -29
  3. data/Rakefile +103 -1
  4. data/app/assets/config/manifest.js +4 -1
  5. data/app/assets/javascripts/jinda_bootstrap.js +20 -0
  6. data/app/assets/stylesheets/_jinda_bootstrap_theme.scss +190 -0
  7. data/{lib/generators/jinda/templates/app/assets/stylesheets/jinda_jqm.css.scss → app/assets/stylesheets/jinda_bootstrap.css.scss} +12 -10
  8. data/app/config/routes.rb +38 -28
  9. data/app/controllers/concerns/jinda_general_concern.rb +86 -87
  10. data/app/controllers/concerns/jinda_run_concern.rb +184 -184
  11. data/app/controllers/jinda_controller.rb +23 -22
  12. data/bin/lint_modified +21 -0
  13. data/config/routes.rb +41 -22
  14. data/lib/generators/jinda/config_generator.rb +102 -81
  15. data/lib/generators/jinda/install_generator.rb +305 -148
  16. data/lib/generators/jinda/install_generator.rb.bak2 +268 -0
  17. data/lib/generators/jinda/installer/gems_install.rb +125 -127
  18. data/lib/generators/jinda/minitest_generator.rb +19 -18
  19. data/lib/generators/jinda/rspec_generator.rb +15 -14
  20. data/lib/generators/jinda/templates/DOCKER.md +188 -0
  21. data/lib/generators/jinda/templates/Dockerfile +15 -5
  22. data/lib/generators/jinda/templates/README.md +3 -3
  23. data/lib/generators/jinda/templates/app/assets/config/manifest.js +4 -0
  24. data/lib/generators/jinda/templates/app/assets/javascripts/application.js +8 -8
  25. data/lib/generators/jinda/templates/app/channels/application_cable/channel.rb +2 -0
  26. data/lib/generators/jinda/templates/app/channels/application_cable/connection.rb +2 -0
  27. data/{test/dummy → lib/generators/jinda/templates}/app/controllers/adminltes_controller.rb +1 -0
  28. data/lib/generators/jinda/templates/app/controllers/api/v1/notes_controller.rb +80 -78
  29. data/lib/generators/jinda/templates/app/controllers/jinda_org/admins_controller.rb +4 -2
  30. data/lib/generators/jinda/templates/app/controllers/jinda_org/application_controller.rb +11 -9
  31. data/lib/generators/jinda/templates/app/controllers/jinda_org/articles_controller.rb +40 -44
  32. data/lib/generators/jinda/templates/app/controllers/jinda_org/comments_controller.rb +10 -8
  33. data/lib/generators/jinda/templates/app/controllers/jinda_org/docs_controller.rb +23 -24
  34. data/lib/generators/jinda/templates/app/controllers/jinda_org/identities_controller.rb +3 -1
  35. data/lib/generators/jinda/templates/app/controllers/jinda_org/notes_controller.rb +25 -27
  36. data/lib/generators/jinda/templates/app/controllers/jinda_org/password_resets_controller.rb +16 -18
  37. data/lib/generators/jinda/templates/app/controllers/jinda_org/sessions_controller.rb +13 -14
  38. data/lib/generators/jinda/templates/app/controllers/jinda_org/sitemap_controller.rb +4 -4
  39. data/lib/generators/jinda/templates/app/controllers/jinda_org/users_controller.rb +14 -14
  40. data/lib/generators/jinda/templates/app/controllers/mindmap_editor_controller.rb +74 -0
  41. data/lib/generators/jinda/templates/app/helpers/admins_helper.rb +2 -0
  42. data/lib/generators/jinda/templates/app/helpers/application_helper.rb +21 -20
  43. data/lib/generators/jinda/templates/app/helpers/articles_helper.rb +2 -0
  44. data/lib/generators/jinda/templates/app/helpers/basic_helper.rb +2 -0
  45. data/lib/generators/jinda/templates/app/helpers/comments_helper.rb +2 -0
  46. data/lib/generators/jinda/templates/app/helpers/ctrs_helper.rb +2 -0
  47. data/lib/generators/jinda/templates/app/helpers/devs_helper.rb +2 -0
  48. data/lib/generators/jinda/templates/app/helpers/mindmap_editor_helper.rb +3 -0
  49. data/lib/generators/jinda/templates/app/helpers/pictures_helper.rb +2 -0
  50. data/lib/generators/jinda/templates/app/helpers/sitemap_helper.rb +2 -0
  51. data/lib/generators/jinda/templates/app/helpers/users_helper.rb +2 -0
  52. data/lib/generators/jinda/templates/app/jinda/index.mm +276 -298
  53. data/lib/generators/jinda/templates/app/jinda/template/index.mm +1 -0
  54. data/lib/generators/jinda/templates/app/mailers/jinda_mailer.rb +5 -3
  55. data/lib/generators/jinda/templates/app/mailers/note_mailer.rb +6 -4
  56. data/lib/generators/jinda/templates/app/mailers/user_mailer.rb +5 -5
  57. data/lib/generators/jinda/templates/app/models/address.rb +10 -8
  58. data/lib/generators/jinda/templates/app/models/article.rb +8 -6
  59. data/lib/generators/jinda/templates/app/models/comment.rb +10 -8
  60. data/lib/generators/jinda/templates/app/models/identity.rb +11 -10
  61. data/lib/generators/jinda/templates/app/models/jinda/doc.rb +36 -33
  62. data/lib/generators/jinda/templates/app/models/jinda/jinda_module.rb +15 -0
  63. data/lib/generators/jinda/templates/app/models/jinda/module.rb +14 -10
  64. data/lib/generators/jinda/templates/app/models/jinda/notice.rb +15 -11
  65. data/lib/generators/jinda/templates/app/models/jinda/role.rb +11 -7
  66. data/lib/generators/jinda/templates/app/models/jinda/runseq.rb +23 -20
  67. data/lib/generators/jinda/templates/app/models/jinda/service.rb +19 -15
  68. data/lib/generators/jinda/templates/app/models/jinda/xmain.rb +42 -36
  69. data/lib/generators/jinda/templates/app/models/note.rb +14 -10
  70. data/lib/generators/jinda/templates/app/models/param.rb +23 -20
  71. data/lib/generators/jinda/templates/app/models/person.rb +9 -7
  72. data/lib/generators/jinda/templates/app/models/user.rb +42 -41
  73. data/lib/generators/jinda/templates/app/views/articles/show.html.haml +2 -2
  74. data/lib/generators/jinda/templates/app/views/identities/new.html.haml +13 -0
  75. data/lib/generators/jinda/templates/app/views/jinda/_static_bootstrap.haml +23 -0
  76. data/lib/generators/jinda/templates/app/views/jinda/feed.rss.builder +15 -13
  77. data/lib/generators/jinda/templates/app/views/jinda/index.html.haml +3 -2
  78. data/lib/generators/jinda/templates/app/views/layouts/application.haml +31 -4
  79. data/lib/generators/jinda/templates/app/views/layouts/lte/_header.haml +54 -0
  80. data/{test/dummy → lib/generators/jinda/templates}/app/views/layouts/lte/_sidebar.haml +1 -1
  81. data/lib/generators/jinda/templates/app/views/mindmap_editor/edit.html.haml +126 -0
  82. data/lib/generators/jinda/templates/app/views/mindmap_editor/save.html.haml +2 -0
  83. data/lib/generators/jinda/templates/app/views/sessions/new.html.haml +13 -0
  84. data/lib/generators/jinda/templates/bin/lint_modified +21 -0
  85. data/lib/generators/jinda/templates/config/mongoid.yml +3 -3
  86. data/lib/generators/jinda/templates/config/mongoid.yml-docker +3 -3
  87. data/lib/generators/jinda/templates/config/mongoid.yml-localhost +3 -3
  88. data/lib/generators/jinda/templates/docker-compose-mongodb.yml +13 -0
  89. data/lib/generators/jinda/templates/docker-compose-web.yml +36 -0
  90. data/lib/generators/jinda/templates/docker-compose.yml +10 -14
  91. data/lib/generators/jinda/templates/spec/controllers/api/v1_get_index_spec.rb +15 -14
  92. data/lib/generators/jinda/templates/spec/controllers/api/v1_get_my_spec.rb +9 -4
  93. data/lib/generators/jinda/templates/spec/controllers/api/v1_post_spec.rb +4 -3
  94. data/lib/generators/jinda/templates/spec/controllers/sessions_controller_spec.rb +82 -90
  95. data/lib/generators/jinda/templates/spec/features/userlogins_spec.rb +12 -15
  96. data/lib/generators/jinda/templates/spec/mailers/note_spec.rb +5 -8
  97. data/lib/generators/jinda/templates/spec/mailers/previews/note_preview.rb +3 -5
  98. data/lib/generators/jinda/templates/spec/models/note_spec.rb +36 -35
  99. data/lib/generators/jinda/templates/spec/models/user_spec.rb +10 -8
  100. data/lib/generators/jinda/templates/spec/rails_helper.rb +29 -31
  101. data/lib/generators/jinda/templates/spec/spec_helper.rb +19 -17
  102. data/lib/generators/jinda/templates/spec/support/authentication_helper.rb +8 -7
  103. data/lib/generators/jinda/templates/spec/support/databasecleaner.rb +3 -1
  104. data/lib/generators/jinda/templates/spec/support/factory_bot.rb +7 -5
  105. data/lib/generators/jinda/templates/spec/support/omniauth_macros.rb +14 -19
  106. data/lib/generators/jinda/templates/spec/support/request_spec_helper.rb +3 -1
  107. data/lib/generators/jinda/templates/spec/views/articles/_article.html.erb_spec.rbx +9 -8
  108. data/lib/generators/jinda/templates/test/application_system_test_case.rb +3 -1
  109. data/lib/generators/jinda/templates/test/integration/jinda_routes_test.rb +16 -21
  110. data/lib/generators/jinda/templates/test/test_helper.rb +7 -3
  111. data/lib/jinda/date_helpers.rb +50 -41
  112. data/lib/jinda/gem_helpers.rb +10 -8
  113. data/lib/jinda/gen_class.rb +14 -12
  114. data/lib/jinda/gen_controller.rb +9 -8
  115. data/lib/jinda/gen_freemind.rb +33 -32
  116. data/lib/jinda/gen_helpers.rb +146 -139
  117. data/lib/jinda/gen_models.rb +125 -131
  118. data/lib/jinda/gen_modules.rb +21 -16
  119. data/lib/jinda/gen_runseq.rb +71 -67
  120. data/lib/jinda/gen_services.rb +74 -80
  121. data/lib/jinda/gen_xmain.rb +38 -36
  122. data/lib/jinda/get_app.rb +31 -29
  123. data/lib/jinda/helpers.rb +4 -4
  124. data/lib/jinda/init_vars.rb +41 -36
  125. data/lib/jinda/mindmap_converter.rb +196 -0
  126. data/lib/jinda/railtie.rb +10 -2
  127. data/lib/jinda/rake_views.rb +61 -60
  128. data/lib/jinda/refresh.rb +67 -61
  129. data/lib/jinda/themes.rb +80 -60
  130. data/lib/jinda/version.rb +3 -1
  131. data/lib/jinda.rb +2 -0
  132. data/lib/tasks/jinda.rake +25 -22
  133. data/test/INTEGRATION_TEST_README.md +374 -0
  134. data/test/LOCAL_DEVELOPMENT.md +345 -0
  135. data/test/README.md +243 -0
  136. data/test/TEST_INFRASTRUCTURE.md +412 -0
  137. data/test/TEST_INSTALLATION_SH_FIXES.md +205 -0
  138. data/test/UNIT_TESTS_README.md +366 -0
  139. data/test/api_notes_controller_test.rb +231 -0
  140. data/test/dummy/DOCKER.md +188 -0
  141. data/test/dummy/Dockerfile +15 -7
  142. data/test/dummy/Gemfile +38 -29
  143. data/test/dummy/Gemfile.lock +671 -292
  144. data/test/dummy/app/assets/config/manifest.js +4 -0
  145. data/test/dummy/app/channels/application_cable/channel.rb +2 -0
  146. data/test/dummy/app/channels/application_cable/connection.rb +2 -0
  147. data/test/dummy/app/controllers/admins_controller.rb +4 -2
  148. data/test/dummy/app/controllers/api/v1/notes_controller.rb +80 -78
  149. data/test/dummy/app/controllers/application_controller.rb +11 -9
  150. data/test/dummy/app/controllers/articles_controller.rb +40 -44
  151. data/test/dummy/app/controllers/comments_controller.rb +10 -8
  152. data/test/dummy/app/controllers/ctrs_controller.rb +2 -0
  153. data/test/dummy/app/controllers/devs_controller.rb +2 -0
  154. data/test/dummy/app/controllers/docs_controller.rb +23 -24
  155. data/test/dummy/app/controllers/identities_controller.rb +3 -1
  156. data/test/dummy/app/controllers/mindmap_editor_controller.rb +74 -0
  157. data/test/dummy/app/controllers/notes_controller.rb +25 -27
  158. data/test/dummy/app/controllers/password_resets_controller.rb +16 -18
  159. data/test/dummy/app/controllers/sessions_controller.rb +13 -14
  160. data/test/dummy/app/controllers/sitemap_controller.rb +4 -4
  161. data/test/dummy/app/controllers/users_controller.rb +14 -14
  162. data/test/dummy/app/helpers/admins_helper.rb +2 -0
  163. data/test/dummy/app/helpers/application_helper.rb +21 -20
  164. data/test/dummy/app/helpers/articles_helper.rb +2 -0
  165. data/test/dummy/app/helpers/basic_helper.rb +2 -0
  166. data/test/dummy/app/helpers/comments_helper.rb +2 -0
  167. data/test/dummy/app/helpers/ctrs_helper.rb +2 -0
  168. data/test/dummy/app/helpers/devs_helper.rb +2 -0
  169. data/test/dummy/app/helpers/mindmap_editor_helper.rb +3 -0
  170. data/test/dummy/app/helpers/pictures_helper.rb +2 -0
  171. data/test/dummy/app/helpers/sitemap_helper.rb +2 -0
  172. data/test/dummy/app/helpers/users_helper.rb +2 -0
  173. data/test/dummy/app/jinda/index.mm +384 -486
  174. data/test/dummy/app/jinda/template/index.mm +1 -0
  175. data/test/dummy/app/mailers/application_mailer.rb +2 -2
  176. data/test/dummy/app/mailers/application_mailer.rb-org +4 -0
  177. data/test/dummy/app/mailers/jinda_mailer.rb +5 -3
  178. data/test/dummy/app/mailers/note_mailer.rb +6 -4
  179. data/test/dummy/app/mailers/user_mailer.rb +5 -5
  180. data/test/dummy/app/models/address.rb +2 -0
  181. data/test/dummy/app/models/article.rb +2 -0
  182. data/test/dummy/app/models/comment.rb +3 -2
  183. data/test/dummy/app/models/identity.rb +11 -10
  184. data/test/dummy/app/models/jinda/doc.rb +36 -33
  185. data/test/dummy/app/models/jinda/jinda_module.rb +15 -0
  186. data/test/dummy/app/models/jinda/module.rb +14 -10
  187. data/test/dummy/app/models/jinda/notice.rb +15 -11
  188. data/test/dummy/app/models/jinda/role.rb +11 -7
  189. data/test/dummy/app/models/jinda/runseq.rb +23 -20
  190. data/test/dummy/app/models/jinda/service.rb +19 -15
  191. data/test/dummy/app/models/jinda/xmain.rb +42 -36
  192. data/test/dummy/app/models/note.rb +3 -8
  193. data/test/dummy/app/models/param.rb +23 -20
  194. data/test/dummy/app/models/person.rb +2 -0
  195. data/test/dummy/app/models/picture.rb +11 -0
  196. data/test/dummy/app/models/user.rb +42 -41
  197. data/test/dummy/app/views/admins/index.haml +21 -0
  198. data/test/dummy/app/views/api/v1/notes/delete/select_note.html.erb +21 -0
  199. data/test/dummy/app/views/api/v1/notes/edit/edit_note.html.erb +21 -0
  200. data/test/dummy/app/views/api/v1/notes/index.haml +21 -0
  201. data/test/dummy/app/views/api/v1/notes/new/new_note.html.erb +21 -0
  202. data/test/dummy/app/views/articles/show.html.haml +2 -2
  203. data/test/dummy/app/views/devs/index.haml +21 -0
  204. data/test/dummy/app/views/jinda/feed.rss.builder +15 -13
  205. data/test/dummy/app/views/jinda/index.html.haml +3 -2
  206. data/test/dummy/app/views/layouts/application.haml +2 -2
  207. data/test/dummy/app/views/mindmap_editor/edit.html.haml +126 -0
  208. data/test/dummy/app/views/mindmap_editor/save.html.haml +2 -0
  209. data/test/dummy/bin/docker-entrypoint +3 -0
  210. data/test/dummy/bin/lint_modified +21 -0
  211. data/test/dummy/bin/setup +1 -1
  212. data/test/dummy/config/application.rb +7 -2
  213. data/test/dummy/config/boot.rb +2 -1
  214. data/test/dummy/config/cable.yml +1 -1
  215. data/test/dummy/config/credentials.yml.enc +1 -1
  216. data/test/dummy/config/environments/development.rb +7 -1
  217. data/test/dummy/config/environments/production.rb +30 -26
  218. data/test/dummy/config/environments/test.rb +12 -8
  219. data/test/dummy/config/initializers/content_security_policy.rb +2 -2
  220. data/test/dummy/config/initializers/filter_parameter_logging.rb +3 -3
  221. data/test/dummy/config/initializers/mindmap_converter.rb +5 -0
  222. data/test/dummy/config/initializers/mongoid.rb +24 -9
  223. data/test/dummy/config/initializers/omniauth.rb +5 -0
  224. data/test/dummy/config/initializers/permissions_policy.rb +11 -9
  225. data/test/dummy/config/locales/en.yml +11 -13
  226. data/test/dummy/config/mongoid.yml +172 -53
  227. data/test/dummy/config/mongoid.yml-docker +3 -3
  228. data/test/dummy/config/mongoid.yml-localhost +3 -3
  229. data/test/dummy/config/puma.rb +21 -20
  230. data/test/dummy/config/routes.rb +7 -1
  231. data/test/dummy/docker-compose-mongodb.yml +13 -0
  232. data/test/dummy/docker-compose-web.yml +36 -0
  233. data/test/dummy/docker-compose.yml +10 -18
  234. data/test/dummy/log/development.log +5834 -2261
  235. data/test/dummy/spec/controllers/api/v1_get_index_spec.rb +15 -14
  236. data/test/dummy/spec/controllers/api/v1_get_my_spec.rb +9 -4
  237. data/test/dummy/spec/controllers/api/v1_post_spec.rb +4 -3
  238. data/test/dummy/spec/controllers/sessions_controller_spec.rb +82 -90
  239. data/test/dummy/spec/factories/pictures.rb +5 -0
  240. data/test/dummy/spec/features/userlogins_spec.rb +12 -15
  241. data/test/dummy/spec/mailers/note_spec.rb +5 -8
  242. data/test/dummy/spec/mailers/previews/note_preview.rb +3 -5
  243. data/test/dummy/spec/models/note_spec.rb +36 -35
  244. data/test/dummy/spec/models/picture_spec.rb +5 -0
  245. data/test/dummy/spec/models/user_spec.rb +10 -8
  246. data/test/dummy/spec/rails_helper.rb +29 -31
  247. data/test/dummy/spec/requests/ctrs_spec.rb +7 -0
  248. data/test/dummy/spec/requests/devs_spec.rb +7 -0
  249. data/test/dummy/spec/spec_helper.rb +19 -17
  250. data/test/dummy/spec/support/authentication_helper.rb +8 -7
  251. data/test/dummy/spec/support/databasecleaner.rb +3 -1
  252. data/test/dummy/spec/support/factory_bot.rb +7 -5
  253. data/test/dummy/spec/support/omniauth_macros.rb +14 -19
  254. data/test/dummy/spec/support/request_spec_helper.rb +3 -1
  255. data/test/dummy/spec/views/articles/_article.html.erb_spec.rbx +9 -8
  256. data/test/generated_app_test.rb +261 -0
  257. data/test/installation_test.rb +368 -0
  258. data/test/integration_test.rb +398 -0
  259. data/test/jenkins_stage_test.rb +182 -0
  260. data/test/note_model_test.rb +224 -0
  261. data/test/note_validation_integration_test.rb +292 -0
  262. data/test/run_unit_tests.sh +91 -0
  263. data/test/test_helper.rb +8 -16
  264. metadata +188 -60
  265. data/lib/generators/jinda/templates/app/assets/stylesheets/application.css.scss +0 -15
  266. data/lib/generators/jinda/templates/app/controllers/jinda_org/password_resets.rb +0 -28
  267. data/lib/generators/jinda/templates/app/views/layouts/_head.html.erb +0 -10
  268. data/lib/generators/jinda/templates/app/views/layouts/_meta_tag.html.erb +0 -19
  269. data/lib/generators/jinda/templates/app/views/layouts/bsb/_footer.haml +0 -7
  270. data/lib/generators/jinda/templates/app/views/layouts/bsb/_header.haml +0 -147
  271. data/lib/generators/jinda/templates/app/views/layouts/bsb/_menu.haml +0 -47
  272. data/lib/generators/jinda/templates/app/views/layouts/bsb/_menu_mm.haml +0 -34
  273. data/lib/generators/jinda/templates/app/views/layouts/bsb/_sidebar.haml +0 -155
  274. data/lib/generators/jinda/templates/app/views/layouts/bsb/application.haml-bsb +0 -47
  275. data/lib/generators/jinda/templates/app/views/layouts/gmail.html.erb +0 -9
  276. data/lib/generators/jinda/templates/app/views/layouts/jqm/_full.haml +0 -33
  277. data/lib/generators/jinda/templates/app/views/layouts/jqm/_page.haml +0 -16
  278. data/lib/generators/jinda/templates/app/views/layouts/jqm/application.haml-jqm +0 -4
  279. data/lib/generators/jinda/templates/app/views/layouts/mailer.html.erb +0 -13
  280. data/lib/generators/jinda/templates/app/views/layouts/mailer.html.haml +0 -3
  281. data/lib/generators/jinda/templates/app/views/layouts/mailer.text.erb +0 -1
  282. data/lib/generators/jinda/templates/app/views/layouts/mailer.text.haml +0 -1
  283. data/lib/generators/jinda/templates/app/views/layouts/mobile.html.erb +0 -13
  284. data/lib/generators/jinda/templates/app/views/layouts/mobilejq.html.erb +0 -31
  285. data/lib/generators/jinda/templates/app/views/layouts/print.html.erb +0 -22
  286. data/lib/generators/jinda/templates/app/views/layouts/utf8.html.erb +0 -22
  287. data/lib/generators/jinda/templates/config/initializers/fix_mongoid_generator.rb-org +0 -14
  288. data/test/dummy/Guardfile +0 -96
  289. data/test/dummy/app/controllers/application_controller.rb.bak +0 -2
  290. data/test/dummy/app/controllers/password_resets.rb +0 -28
  291. data/test/dummy/app/helpers/application_helper.rb.bak +0 -2
  292. data/test/dummy/app/views/identities/new-bak.html.haml +0 -32
  293. data/test/dummy/app/views/layouts/application.haml.bak +0 -4
  294. data/test/dummy/app/views/layouts/application.html.erb.bak +0 -15
  295. data/test/dummy/app/views/layouts/lte/_header.haml +0 -111
  296. data/test/dummy/app/views/layouts/lte/_rightbar.haml +0 -123
  297. data/test/dummy/app/views/sessions/new-bak.html.haml +0 -22
  298. data/test/dummy/config/initializers/fix_mongoid_generator.rb-org +0 -14
  299. data/test/dummy/tmp/development_secret.txt +0 -1
  300. data/test/integration/navigation_test.rb +0 -7
  301. data/test/jinda_test.rb +0 -7
  302. /data/{test/dummy → lib/generators/jinda/templates}/app/assets/stylesheets/application.scss +0 -0
  303. /data/{test/dummy → lib/generators/jinda/templates}/app/assets/stylesheets/jinda.scss +0 -0
  304. /data/lib/generators/jinda/templates/app/mailers/{application_mailer.rb → application_mailer.rb-org} +0 -0
  305. /data/{test/dummy → lib/generators/jinda/templates}/app/views/adminltes/dashboard1.haml +0 -0
  306. /data/{test/dummy → lib/generators/jinda/templates}/app/views/adminltes/dashboard2.haml +0 -0
  307. /data/{test/dummy → lib/generators/jinda/templates}/app/views/layouts/lte/_flash.haml +0 -0
  308. /data/{test/dummy → lib/generators/jinda/templates}/app/views/layouts/lte/_footer.haml +0 -0
  309. /data/{test/dummy → lib/generators/jinda/templates}/app/views/layouts/lte/_menu.haml +0 -0
  310. /data/{test/dummy → lib/generators/jinda/templates}/app/views/layouts/lte/_menu_mm.haml +0 -0
  311. /data/lib/generators/jinda/templates/app/views/layouts/{bsb → lte}/_rightbar.haml +0 -0
data/lib/jinda/themes.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  # ############################### Themes ###################################
3
4
  #
@@ -6,104 +7,118 @@
6
7
  # ##########################################################################
7
8
  def get_login_user_info
8
9
  if current_ma_user.present?
9
- $user_image = ((current_ma_user.image != "") ? current_ma_user.image : asset_url("user.png", :width => "48"))
10
- $user_name = current_ma_user.code
10
+ $user_image = (current_ma_user.image == '' ? asset_url('user.png', width: '48') : current_ma_user.image)
11
+ $user_name = current_ma_user.code
11
12
  $user_email = current_ma_user.email
12
- $user_id = current_ma_user.try(:id)
13
+ $user_id = current_ma_user.try(:id)
13
14
  else
14
- $user_image = asset_url("user.png", :width => "48")
15
- $user_name = 'Guest User'
15
+ $user_image = asset_url('user.png', width: '48')
16
+ $user_name = 'Guest User'
16
17
  $user_email = 'guest@sample.com'
17
- $user_id = ''
18
+ $user_id = ''
18
19
  end
19
- return $user_image, $user_name, $user_email,$user_id
20
+ [$user_image, $user_name, $user_email, $user_id]
20
21
  end
22
+
21
23
  # search image from User in Article/View/Show
22
24
  def get_user_image(user_id)
23
25
  user_image = User.find(user_id).image
24
- user_image = ((user_image != "") ? user_image : asset_url("user.png", :width => "48"))
25
- return user_image
26
+ (user_image == '' ? asset_url('user.png', width: '48') : user_image)
26
27
  end
27
28
 
28
-
29
29
  def name2code(s)
30
30
  # rather not ignore # symbol cause it could be comment
31
- code, name = s.split(':')
32
- code.downcase.strip.gsub(' ','_').gsub(/[^#_\/a-zA-Z0-9]/,'')
31
+ code, = s.split(':')
32
+ code.downcase.strip.tr(' ', '_').gsub(%r{[^#_/a-zA-Z0-9]}, '')
33
33
  end
34
+
34
35
  def name2camel(s)
35
- s.gsub(' ','_').camelcase
36
+ s.tr(' ', '_').camelcase
36
37
  end
38
+
37
39
  def true_action?(s)
38
- %w(call ws redirect invoke email).include? s
40
+ %w[call ws redirect invoke email].include? s
39
41
  end
42
+
40
43
  def set_global
41
- $xmain= @xmain ; $runseq = @runseq ; $user = current_ma_user ; $xvars= @xmain.xvars; $ip = request.env["REMOTE_ADDR"]
44
+ $xmain = @xmain
45
+ $runseq = @runseq
46
+ $user = current_ma_user
47
+ $xvars = @xmain.xvars
48
+ $ip = request.env['REMOTE_ADDR']
42
49
  end
43
- def authorize? # use in pending tasks
44
- @runseq= @xmain.runseqs.find @xmain.current_runseq
50
+
51
+ # use in pending tasks
52
+ def authorize?
53
+ @runseq = @xmain.runseqs.find @xmain.current_runseq
45
54
  return false unless @runseq
55
+
46
56
  @user = current_ma_user
47
57
  set_global
48
- return false unless eval(@runseq.rule) if @runseq.rule
58
+ return false if @runseq.rule && @runseq.rule && !eval(@runseq.rule)
49
59
  return true if true_action?(@runseq.action)
50
60
  # return false if check_wait
51
61
  return true if @runseq.role.blank?
62
+
52
63
  unless @runseq.role.empty?
53
64
  return false unless @user.role
65
+
54
66
  return @user.role.upcase.split(',').include?(@runseq.role.upcase)
55
67
  end
56
- return true
68
+ true
57
69
  end
58
- def authorize_init? # use when initialize new transaction
70
+
71
+ # use when initialize new transaction
72
+ def authorize_init?
59
73
  # check module role
60
74
  mrole = @service.module.role
61
75
  return false if mrole && !current_ma_user
62
76
  return false if mrole && !current_ma_user.has_role(mrole)
63
77
 
64
78
  # check step 1 role
65
- xml= @service.xml
79
+ xml = @service.xml
66
80
  step1 = REXML::Document.new(xml).root.elements['node']
67
- role= get_option_xml("role", step1) || ""
81
+ role = get_option_xml('role', step1) || ''
68
82
  # rule= get_option_xml("rule", step1) || true
69
- rule= get_option_xml("rule", step1) || true
70
- return true if role==""
71
- unless current_ma_user
72
- return role.blank?
73
- else
74
- return false unless current_ma_user.role
75
- return current_ma_user.has_role(role)
76
- end
83
+ get_option_xml('rule', step1) || true
84
+ return true if role == ''
85
+ return role.blank? unless current_ma_user
77
86
 
87
+ return false unless current_ma_user.role
88
+
89
+ current_ma_user.has_role(role)
78
90
  end
91
+
79
92
  def ma_log(message)
80
93
  # Jinda::Notice.create :message => ERB::Util.html_escape(message.gsub("`","'")),
81
94
  # :unread=> true, :ip=> ($ip || request.env["REMOTE_ADDR"])
82
95
  if session[:user_id]
83
- Jinda::Notice.create :message => ERB::Util.html_escape(message.gsub("`","'")),
84
- :user_id => $user.id, :unread=> true, :ip=>request.env["REMOTE_ADDR"]
96
+ Jinda::Notice.create message: ERB::Util.html_escape(message.tr('`', "'")),
97
+ user_id: $user.id, unread: true, ip: request.env['REMOTE_ADDR']
85
98
  else
86
- Jinda::Notice.create :message => ERB::Util.html_escape(message.gsub("`","'")),
87
- :unread=> true, :ip=>request.env["REMOTE_ADDR"]
99
+ Jinda::Notice.create message: ERB::Util.html_escape(message.tr('`', "'")),
100
+ unread: true, ip: request.env['REMOTE_ADDR']
88
101
  end
89
102
  end
90
103
 
91
- alias :ma_notice :ma_log
104
+ alias ma_notice ma_log
92
105
 
93
106
  # methods from application_helper
94
107
  def markdown(text)
95
108
  begin
96
109
  erbified = ERB.new(text.html_safe).result(binding)
97
- rescue => error
98
- flash[:notice] = "This ruby version not support #{error}"
110
+ rescue StandardError => e
111
+ flash[:notice] = "This ruby version not support #{e}"
99
112
  return
100
113
  end
101
- red = Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true)
114
+ red = Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: true, space_after_headers: true)
102
115
  red.render(erbified).html_safe
103
116
  end
104
- def align_text(s, pixel=3)
117
+
118
+ def align_text(s, pixel = 3)
105
119
  "<span style='position:relative; top:-#{pixel}px;'>#{s}</span>".html_safe
106
120
  end
121
+
107
122
  def status_icon(status)
108
123
  case status
109
124
  when 'R'
@@ -120,32 +135,38 @@ def status_icon(status)
120
135
  image_tag 'cancel.png'
121
136
  end
122
137
  end
138
+
123
139
  def role_name(code)
124
- role= Jinda::Role.where(code:code).first
125
- return role ? role.name : ""
140
+ role = Jinda::Role.where(code: code).first
141
+ role ? role.name : ''
126
142
  end
143
+
127
144
  def uncomment(s)
128
- s.sub(/^#\s/,'')
145
+ s.sub(/^#\s/, '')
129
146
  end
147
+
130
148
  def code_div(s)
131
149
  "<pre style='background-color: #efffef;'><code class='ruby' lang='ruby'> #{s}</code></pre>".html_safe
132
150
  end
151
+
133
152
  def ajax?(s)
134
- return s.match('file_field') ? false : true
135
- end
136
- def step(s, total) # square text
137
- s = (s==0)? 1: s.to_i
138
- total = total.to_i
139
- out ="<div class='step'>"
140
- (s-1).times {|ss| out += "<span class='steps_done'>#{(ss+1)}</span>" }
141
- out += %Q@<span class='step_now' >@
142
- out += s.to_s
143
- out += "</span>"
144
- out += %Q@@
145
- for i in s+1..total
153
+ !s.match?('file_field')
154
+ end
155
+
156
+ # square text
157
+ def step(s, total)
158
+ s = s.zero? ? 1 : s.to_i
159
+ total = total.to_i
160
+ out = "<div class='step'>"
161
+ (s - 1).times { |ss| out += "<span class='steps_done'>#{ss + 1}</span>" }
162
+ out += %(<span class='step_now' >)
163
+ out += s.to_s
164
+ out += '</span>'
165
+ out += %()
166
+ ((s + 1)..total).each do |i|
146
167
  out += "<span class='steps_more'>#{i}</span>"
147
168
  end
148
- out += "</div>"
169
+ out += '</div>'
149
170
  out.html_safe
150
171
  end
151
172
 
@@ -155,13 +176,13 @@ def current_ma_user
155
176
  # else
156
177
  # return nil
157
178
  # end
158
- #@user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
159
- @user ||= User.where(:auth_token => cookies[:auth_token]).first if cookies[:auth_token]
160
- return @user
179
+ # @user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
180
+ @user ||= User.where(auth_token: cookies[:auth_token]).first if cookies[:auth_token]
181
+ @user
161
182
  end
162
183
 
163
184
  def ui_action?(s)
164
- %w(form output mail pdf).include? s
185
+ %w[form output mail pdf].include? s
165
186
  end
166
187
  # def handle_ma_notice
167
188
  # if Jinda::Notice.recent.count>0
@@ -172,4 +193,3 @@ end
172
193
  # ""
173
194
  # end
174
195
  # end
175
-
data/lib/jinda/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Jinda
2
- VERSION = "0.7.7.4"
4
+ VERSION = '1.0.0'
3
5
  end
data/lib/jinda.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'jinda/version'
2
4
  require 'jinda/railtie'
3
5
 
data/lib/tasks/jinda.rake CHANGED
@@ -1,42 +1,45 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'jinda'
2
4
  require 'jinda/helpers'
3
5
  include Jinda::Helpers
4
6
 
5
- @btext= "# jinda begin"
6
- @etext= "# jinda end"
7
+ @btext = '# jinda begin'
8
+ @etext = '# jinda end'
7
9
 
8
10
  namespace :jinda do
9
- desc "generate models from mm"
10
- task :update=> :environment do
11
- @app= get_app
11
+ desc 'generate models from mm'
12
+ task update: :environment do
13
+ @app = get_app
12
14
  process_models
13
15
  process_controllers
14
16
  gen_views
15
17
  end
16
18
 
17
- desc "generate admin user"
18
- task :seed=> :environment do
19
- usamples = [
20
- { code: 'admin', password: 'secret', email: 'admin@test.com', role: 'M,A,D', image: 'https://user-images.githubusercontent.com/3953832/110025024-7911b480-7cf4-11eb-83ee-8dbe6e8fc96f.png'},
21
- { code: 'tester', password: 'password', email: 'tester@test.com', role: 'M', image: 'https://www.manateeschools.net/cms/lib/FL02202357/Centricity/domain/2439/staff_photos/fflinststone.jpg'}
19
+ desc 'generate admin user'
20
+ task seed: :environment do
21
+ usamples = [
22
+ { code: 'admin', password: 'secret', email: 'admin@test.com', role: 'M,A,D',
23
+ image: 'https://user-images.githubusercontent.com/3953832/110025024-7911b480-7cf4-11eb-83ee-8dbe6e8fc96f.png' },
24
+ { code: 'tester', password: 'password', email: 'tester@test.com', role: 'M', image: 'https://www.manateeschools.net/cms/lib/FL02202357/Centricity/domain/2439/staff_photos/fflinststone.jpg' }
22
25
  ]
23
26
  usamples.each do |h|
24
- code = h[:code].to_s
25
- email = h[:email].to_s
27
+ code = h[:code].to_s
28
+ email = h[:email].to_s
26
29
  password = h[:password].to_s
27
- role = h[:role].to_s
28
- image = h[:image]
29
- unless Identity.where(code: code).exists?
30
- identity= Identity.create :code => code, :email => email, :password => password , :password_confirmation => password
31
- User.create :provider => "identity", :uid => identity.id.to_s, :code => identity.code,:email => identity.email, :role => role, :image => image
32
- end
30
+ role = h[:role].to_s
31
+ image = h[:image]
32
+ next if Identity.exists?(code: code)
33
+
34
+ identity = Identity.create code: code, email: email, password: password,
35
+ password_confirmation: password
36
+ User.create provider: 'identity', uid: identity.id.to_s, code: identity.code, email: identity.email,
37
+ role: role, image: image
33
38
  end
34
39
  end
35
40
 
36
- desc "cancel all pending tasks"
37
- task :cancel=> :environment do
41
+ desc 'cancel all pending tasks'
42
+ task cancel: :environment do
38
43
  Jinda::Xmain.update_all "status='X'", "status='I' or status='R'"
39
44
  end
40
45
  end
41
-
42
-
@@ -0,0 +1,374 @@
1
+ # Jinda Integration Tests
2
+
3
+ This directory contains two levels of testing for the Jinda gem:
4
+
5
+ 1. **Installation Tests** (`installation_test.rb`) - Verify the gem generates a working Rails app
6
+ 2. **Integration Tests** (`integration_test.rb`) - Verify the generated app actually works
7
+
8
+ ## Test Flow
9
+
10
+ ```
11
+ ┌─────────────────────────────────────┐
12
+ │ 1. installation_test.rb │
13
+ │ - Creates Rails app │
14
+ │ - Installs Jinda gem │
15
+ │ - Runs generators │
16
+ │ - Seeds database │
17
+ │ - Verifies file structure │
18
+ └──────────────┬──────────────────────┘
19
+
20
+
21
+ ┌─────────────────────────────────────┐
22
+ │ 2. integration_test.rb │
23
+ │ - Starts Rails server │
24
+ │ - Tests home page │
25
+ │ - Tests login (admin/secret) │
26
+ │ - Tests authenticated pages │
27
+ │ - Verifies MongoDB connection │
28
+ └─────────────────────────────────────┘
29
+ ```
30
+
31
+ ## Installation Test (`installation_test.rb`)
32
+
33
+ ### What It Does
34
+
35
+ 1. **Prerequisites Check** - Ruby, Rails, MongoDB
36
+ 2. **Creates Rails App** - `rails new` with Jinda-specific options
37
+ 3. **Adds Jinda Gem** - To Gemfile (local or git source)
38
+ 4. **Bundle Install** - Initial dependencies
39
+ 5. **jinda:install** - Runs the main generator
40
+ 6. **Bundle Install** - Post-generator dependencies
41
+ 7. **jinda:config** - Configures MongoDB, OmniAuth, etc.
42
+ 8. **Updates MongoDB Config** - Sets correct port
43
+ 9. **jinda:seed** - Creates admin user (username: admin, password: secret)
44
+ 10. **Rails Environment** - Verifies it loads
45
+ 11. **Rails Server** - Starts and responds to HTTP
46
+ 12. **Verifies Files** - All required files exist
47
+
48
+ ### Test App Location
49
+
50
+ Generated apps are created in: `~/tmp/jinda_tests/jinda_test_<timestamp>`
51
+
52
+ ### Usage
53
+
54
+ ```bash
55
+ # Run with local gem (default)
56
+ rake test_installation
57
+ # or
58
+ ruby test/installation_test.rb
59
+
60
+ # Run with git source
61
+ JINDA_GEM_SOURCE=git ruby test/installation_test.rb
62
+
63
+ # Run with specific branch
64
+ JINDA_GEM_SOURCE=git JINDA_GIT_BRANCH=jinda-0.8.0 ruby test/installation_test.rb
65
+
66
+ # Keep test app for debugging
67
+ SKIP_CLEANUP=true ruby test/installation_test.rb
68
+
69
+ # Custom MongoDB port
70
+ MONGODB_PORT=27017 ruby test/installation_test.rb
71
+ ```
72
+
73
+ ### Expected Output
74
+
75
+ ```
76
+ 12 runs, 33 assertions, 0 failures, 0 errors, 0 skips
77
+ ```
78
+
79
+ ## Integration Test (`integration_test.rb`)
80
+
81
+ ### What It Does
82
+
83
+ Tests the **actual functionality** of the generated Jinda Rails application:
84
+
85
+ 1. **Starts Rails Server** - In background on port 3000
86
+ 2. **Home Page Loads** - Verifies HTTP 200/302
87
+ 3. **Version Info Displayed** - Ruby, Rails, Jinda gem versions
88
+ 4. **Installation Info** - Documentation section visible
89
+ 5. **Login Page Accessible** - `/auth/identity` route works
90
+ 6. **Admin Login** - Tests with username: "admin", password: "secret"
91
+ 7. **Authenticated Dashboard** - Session cookie maintained
92
+ 8. **Users Page** - Admin can access `/users`
93
+ 9. **Articles Page** - Route responds correctly
94
+ 10. **Logout Functionality** - Session cleanup
95
+ 11. **MongoDB Connection** - Database accessible from Rails
96
+ 12. **Admin User Exists** - Seeded data verified
97
+
98
+ ### Content Verification
99
+
100
+ The test verifies the home page (based on your screenshot) contains:
101
+
102
+ - ✓ "Jinda" title
103
+ - ✓ "Dashboard" section
104
+ - ✓ "Ruby Version 3.3.0"
105
+ - ✓ "Rails Version 7.1.6"
106
+ - ✓ "gem jinda 0.9.0"
107
+ - ✓ "Recently tested with" section
108
+ - ✓ "Create New Rails" instructions
109
+ - ✓ "Installation" section
110
+
111
+ ### Admin Credentials
112
+
113
+ The test uses credentials from `db/seeds.rb`:
114
+
115
+ - **Username**: `admin`
116
+ - **Password**: `secret`
117
+ - **Email**: `admin@test.com`
118
+
119
+ ### Usage
120
+
121
+ ```bash
122
+ # Run integration tests (requires existing test app)
123
+ rake test_integration
124
+ # or
125
+ ruby test/integration_test.rb
126
+
127
+ # Test specific app
128
+ TEST_APP_PATH=/path/to/app ruby test/integration_test.rb
129
+
130
+ # Keep server running after tests (for manual debugging)
131
+ KEEP_SERVER=true ruby test/integration_test.rb
132
+
133
+ # Custom port
134
+ TEST_PORT=3001 ruby test/integration_test.rb
135
+
136
+ # Custom MongoDB port
137
+ MONGODB_PORT=27888 ruby test/integration_test.rb
138
+ ```
139
+
140
+ ### Expected Output
141
+
142
+ ```
143
+ === Starting Rails server on port 3000 ===
144
+ ✓ Server started (PID: 12345)
145
+ ✓ Home page loads successfully
146
+ ✓ Version information displayed correctly
147
+ ✓ Installation information displayed
148
+ ✓ Login page accessible
149
+ ✓ Admin login successful
150
+ ✓ Authenticated access works
151
+ ✓ Users page accessible
152
+ ✓ Articles page responds
153
+ ✓ Logout functionality tested
154
+ ✓ MongoDB connection verified
155
+ ✓ Admin user verified in database
156
+
157
+ 12 runs, 24 assertions, 0 failures, 0 errors, 0 skips
158
+ ```
159
+
160
+ ## Running Both Tests in Sequence
161
+
162
+ ### Full Test Suite
163
+
164
+ ```bash
165
+ # Run both installation and integration tests
166
+ rake test_all
167
+ ```
168
+
169
+ This will:
170
+ 1. Create a new Rails app with Jinda
171
+ 2. Immediately test its functionality
172
+ 3. Clean up afterward (unless `SKIP_CLEANUP=true`)
173
+
174
+ ### Manual Sequence
175
+
176
+ ```bash
177
+ # 1. Installation (creates app)
178
+ SKIP_CLEANUP=true rake test_installation
179
+
180
+ # 2. Find the app path
181
+ ls -lt ~/tmp/jinda_tests/
182
+
183
+ # 3. Integration (tests the app)
184
+ TEST_APP_PATH=~/tmp/jinda_tests/jinda_test_XXXXX rake test_integration
185
+
186
+ # 4. Manual cleanup when done
187
+ rm -rf ~/tmp/jinda_tests/jinda_test_XXXXX
188
+ ```
189
+
190
+ ## Debugging Failed Tests
191
+
192
+ ### Installation Test Failures
193
+
194
+ ```bash
195
+ # Keep the test app
196
+ SKIP_CLEANUP=true ruby test/installation_test.rb
197
+
198
+ # Navigate to it
199
+ cd ~/tmp/jinda_tests/jinda_test_XXXXX
200
+
201
+ # Investigate
202
+ ls -la app/controllers/
203
+ cat config/mongoid.yml
204
+ bundle exec rails console
205
+ ```
206
+
207
+ ### Integration Test Failures
208
+
209
+ ```bash
210
+ # Keep server running
211
+ KEEP_SERVER=true ruby test/integration_test.rb
212
+
213
+ # In another terminal
214
+ curl http://localhost:3000
215
+ curl http://localhost:3000/auth/identity
216
+
217
+ # Check logs
218
+ cd ~/tmp/jinda_tests/jinda_test_XXXXX
219
+ tail -f log/development.log
220
+ tail -f log/test_server.log
221
+ ```
222
+
223
+ ### Common Issues
224
+
225
+ **MongoDB not running:**
226
+ ```bash
227
+ docker run -d --name jinda_mongo -p 27888:27017 mongo:latest
228
+ # or
229
+ MONGODB_PORT=27017 ruby test/installation_test.rb
230
+ ```
231
+
232
+ **Port already in use:**
233
+ ```bash
234
+ # Find process
235
+ lsof -i :3000
236
+ # Kill it
237
+ kill -9 <PID>
238
+ # Or use different port
239
+ TEST_PORT=3001 ruby test/integration_test.rb
240
+ ```
241
+
242
+ **Server won't start:**
243
+ ```bash
244
+ cd ~/tmp/jinda_tests/jinda_test_XXXXX
245
+ cat log/test_server_error.log
246
+ bundle exec rails server # Try manually
247
+ ```
248
+
249
+ ## CI/CD Integration
250
+
251
+ ### GitHub Actions Workflows
252
+
253
+ **RuboCop Workflow** (`rubocop.yml`):
254
+ - Only runs code quality checks
255
+ - Does NOT run tests
256
+ - Fast feedback (~2 min)
257
+
258
+ **Jenkins Test Workflow** (`jenkins-test.yml`):
259
+ - Runs installation tests only
260
+ - Builds gem package
261
+ - Duration: ~5 min
262
+ - Why not integration? Server startup in CI is complex
263
+
264
+ ### Jenkins Pipeline
265
+
266
+ **Jenkinsfile** (`ci/Jenkinsfile`):
267
+ - Runs RuboCop checks
268
+ - Runs installation tests
269
+ - Builds and validates gem
270
+ - Optional: Can be extended to run integration tests
271
+
272
+ To add integration tests to CI, add after installation tests:
273
+
274
+ ```groovy
275
+ stage('Integration Tests') {
276
+ steps {
277
+ echo "=== Running integration tests ==="
278
+ sh '''
279
+ cd ${WORKSPACE}
280
+ TEST_APP_PATH=${WORKSPACE}/tmp/jinda_tests/jinda_test_* \\
281
+ TEST_PORT=3000 \\
282
+ MONGODB_PORT=${MONGODB_PORT} \\
283
+ ruby test/integration_test.rb
284
+ '''
285
+ }
286
+ }
287
+ ```
288
+
289
+ ## Test Maintenance
290
+
291
+ ### Adding New Integration Tests
292
+
293
+ Add tests to `integration_test.rb`:
294
+
295
+ ```ruby
296
+ def test_13_my_new_feature
297
+ skip 'No session cookie from login' unless @@session_cookie
298
+
299
+ uri = URI("#{@base_url}/my_feature")
300
+ http = Net::HTTP.new(uri.host, uri.port)
301
+
302
+ request = Net::HTTP::Get.new(uri.path)
303
+ request['Cookie'] = @@session_cookie
304
+
305
+ response = http.request(request)
306
+
307
+ assert_equal 200, response.code.to_i, 'Feature should be accessible'
308
+ assert_includes response.body, 'expected content'
309
+
310
+ puts '✓ My feature works'
311
+ end
312
+ ```
313
+
314
+ ### Test Naming Convention
315
+
316
+ - `test_01_*` to `test_12_*` - Numbered tests run in order
317
+ - Tests are order-dependent (sequential workflow)
318
+ - Use descriptive names after the number
319
+
320
+ ### Environment Variables
321
+
322
+ | Variable | Default | Description |
323
+ |----------|---------|-------------|
324
+ | `TEST_APP_PATH` | auto | Path to existing Jinda app |
325
+ | `TEST_PORT` | 3000 | Port for Rails server |
326
+ | `MONGODB_PORT` | 27888 | Port for MongoDB |
327
+ | `KEEP_SERVER` | false | Keep server running after tests |
328
+ | `SKIP_CLEANUP` | false | Don't delete test app |
329
+ | `JINDA_GEM_SOURCE` | local | Use 'git' for remote |
330
+ | `JINDA_GIT_URL` | github.com/kul1/jinda.git | Git repo URL |
331
+ | `JINDA_GIT_BRANCH` | default | Specific branch/tag |
332
+
333
+ ## Architecture
334
+
335
+ ### Test Independence
336
+
337
+ - Installation tests are self-contained
338
+ - Integration tests depend on installation tests creating an app
339
+ - Both can run independently if app exists
340
+
341
+ ### Class Variables
342
+
343
+ Both test files use class variables (`@@`) to maintain state across tests:
344
+
345
+ - `@@test_app_path` - Location of test app
346
+ - `@@app_created` - Installation success flag
347
+ - `@@server_pid` - Rails server process
348
+ - `@@session_cookie` - Authentication state
349
+
350
+ ### Cleanup Strategy
351
+
352
+ - Installation test: Cleanup in `Minitest.after_run`
353
+ - Integration test: Kills server in `Minitest.after_run`
354
+ - Both respect `SKIP_CLEANUP` and `KEEP_SERVER` flags
355
+
356
+ ## Summary
357
+
358
+ | Test | Purpose | Duration | CI |
359
+ |------|---------|----------|-----|
360
+ | **installation_test.rb** | Generates working app | ~30s | ✓ |
361
+ | **integration_test.rb** | Tests app functionality | ~20s | Optional |
362
+ | **test_all** | Both in sequence | ~50s | Future |
363
+
364
+ **Quick Start:**
365
+ ```bash
366
+ # Full test suite
367
+ rake test_all
368
+
369
+ # Just installation (CI default)
370
+ rake test
371
+
372
+ # Just integration (requires existing app)
373
+ rake test_integration
374
+ ```