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.
- checksums.yaml +4 -4
- data/README.md +46 -29
- data/Rakefile +103 -1
- data/app/assets/config/manifest.js +4 -1
- data/app/assets/javascripts/jinda_bootstrap.js +20 -0
- data/app/assets/stylesheets/_jinda_bootstrap_theme.scss +190 -0
- data/{lib/generators/jinda/templates/app/assets/stylesheets/jinda_jqm.css.scss → app/assets/stylesheets/jinda_bootstrap.css.scss} +12 -10
- data/app/config/routes.rb +38 -28
- data/app/controllers/concerns/jinda_general_concern.rb +86 -87
- data/app/controllers/concerns/jinda_run_concern.rb +184 -184
- data/app/controllers/jinda_controller.rb +23 -22
- data/bin/lint_modified +21 -0
- data/config/routes.rb +41 -22
- data/lib/generators/jinda/config_generator.rb +102 -81
- data/lib/generators/jinda/install_generator.rb +305 -148
- data/lib/generators/jinda/install_generator.rb.bak2 +268 -0
- data/lib/generators/jinda/installer/gems_install.rb +125 -127
- data/lib/generators/jinda/minitest_generator.rb +19 -18
- data/lib/generators/jinda/rspec_generator.rb +15 -14
- data/lib/generators/jinda/templates/DOCKER.md +188 -0
- data/lib/generators/jinda/templates/Dockerfile +15 -5
- data/lib/generators/jinda/templates/README.md +3 -3
- data/lib/generators/jinda/templates/app/assets/config/manifest.js +4 -0
- data/lib/generators/jinda/templates/app/assets/javascripts/application.js +8 -8
- data/lib/generators/jinda/templates/app/channels/application_cable/channel.rb +2 -0
- data/lib/generators/jinda/templates/app/channels/application_cable/connection.rb +2 -0
- data/{test/dummy → lib/generators/jinda/templates}/app/controllers/adminltes_controller.rb +1 -0
- data/lib/generators/jinda/templates/app/controllers/api/v1/notes_controller.rb +80 -78
- data/lib/generators/jinda/templates/app/controllers/jinda_org/admins_controller.rb +4 -2
- data/lib/generators/jinda/templates/app/controllers/jinda_org/application_controller.rb +11 -9
- data/lib/generators/jinda/templates/app/controllers/jinda_org/articles_controller.rb +40 -44
- data/lib/generators/jinda/templates/app/controllers/jinda_org/comments_controller.rb +10 -8
- data/lib/generators/jinda/templates/app/controllers/jinda_org/docs_controller.rb +23 -24
- data/lib/generators/jinda/templates/app/controllers/jinda_org/identities_controller.rb +3 -1
- data/lib/generators/jinda/templates/app/controllers/jinda_org/notes_controller.rb +25 -27
- data/lib/generators/jinda/templates/app/controllers/jinda_org/password_resets_controller.rb +16 -18
- data/lib/generators/jinda/templates/app/controllers/jinda_org/sessions_controller.rb +13 -14
- data/lib/generators/jinda/templates/app/controllers/jinda_org/sitemap_controller.rb +4 -4
- data/lib/generators/jinda/templates/app/controllers/jinda_org/users_controller.rb +14 -14
- data/lib/generators/jinda/templates/app/controllers/mindmap_editor_controller.rb +74 -0
- data/lib/generators/jinda/templates/app/helpers/admins_helper.rb +2 -0
- data/lib/generators/jinda/templates/app/helpers/application_helper.rb +21 -20
- data/lib/generators/jinda/templates/app/helpers/articles_helper.rb +2 -0
- data/lib/generators/jinda/templates/app/helpers/basic_helper.rb +2 -0
- data/lib/generators/jinda/templates/app/helpers/comments_helper.rb +2 -0
- data/lib/generators/jinda/templates/app/helpers/ctrs_helper.rb +2 -0
- data/lib/generators/jinda/templates/app/helpers/devs_helper.rb +2 -0
- data/lib/generators/jinda/templates/app/helpers/mindmap_editor_helper.rb +3 -0
- data/lib/generators/jinda/templates/app/helpers/pictures_helper.rb +2 -0
- data/lib/generators/jinda/templates/app/helpers/sitemap_helper.rb +2 -0
- data/lib/generators/jinda/templates/app/helpers/users_helper.rb +2 -0
- data/lib/generators/jinda/templates/app/jinda/index.mm +276 -298
- data/lib/generators/jinda/templates/app/jinda/template/index.mm +1 -0
- data/lib/generators/jinda/templates/app/mailers/jinda_mailer.rb +5 -3
- data/lib/generators/jinda/templates/app/mailers/note_mailer.rb +6 -4
- data/lib/generators/jinda/templates/app/mailers/user_mailer.rb +5 -5
- data/lib/generators/jinda/templates/app/models/address.rb +10 -8
- data/lib/generators/jinda/templates/app/models/article.rb +8 -6
- data/lib/generators/jinda/templates/app/models/comment.rb +10 -8
- data/lib/generators/jinda/templates/app/models/identity.rb +11 -10
- data/lib/generators/jinda/templates/app/models/jinda/doc.rb +36 -33
- data/lib/generators/jinda/templates/app/models/jinda/jinda_module.rb +15 -0
- data/lib/generators/jinda/templates/app/models/jinda/module.rb +14 -10
- data/lib/generators/jinda/templates/app/models/jinda/notice.rb +15 -11
- data/lib/generators/jinda/templates/app/models/jinda/role.rb +11 -7
- data/lib/generators/jinda/templates/app/models/jinda/runseq.rb +23 -20
- data/lib/generators/jinda/templates/app/models/jinda/service.rb +19 -15
- data/lib/generators/jinda/templates/app/models/jinda/xmain.rb +42 -36
- data/lib/generators/jinda/templates/app/models/note.rb +14 -10
- data/lib/generators/jinda/templates/app/models/param.rb +23 -20
- data/lib/generators/jinda/templates/app/models/person.rb +9 -7
- data/lib/generators/jinda/templates/app/models/user.rb +42 -41
- data/lib/generators/jinda/templates/app/views/articles/show.html.haml +2 -2
- data/lib/generators/jinda/templates/app/views/identities/new.html.haml +13 -0
- data/lib/generators/jinda/templates/app/views/jinda/_static_bootstrap.haml +23 -0
- data/lib/generators/jinda/templates/app/views/jinda/feed.rss.builder +15 -13
- data/lib/generators/jinda/templates/app/views/jinda/index.html.haml +3 -2
- data/lib/generators/jinda/templates/app/views/layouts/application.haml +31 -4
- data/lib/generators/jinda/templates/app/views/layouts/lte/_header.haml +54 -0
- data/{test/dummy → lib/generators/jinda/templates}/app/views/layouts/lte/_sidebar.haml +1 -1
- data/lib/generators/jinda/templates/app/views/mindmap_editor/edit.html.haml +126 -0
- data/lib/generators/jinda/templates/app/views/mindmap_editor/save.html.haml +2 -0
- data/lib/generators/jinda/templates/app/views/sessions/new.html.haml +13 -0
- data/lib/generators/jinda/templates/bin/lint_modified +21 -0
- data/lib/generators/jinda/templates/config/mongoid.yml +3 -3
- data/lib/generators/jinda/templates/config/mongoid.yml-docker +3 -3
- data/lib/generators/jinda/templates/config/mongoid.yml-localhost +3 -3
- data/lib/generators/jinda/templates/docker-compose-mongodb.yml +13 -0
- data/lib/generators/jinda/templates/docker-compose-web.yml +36 -0
- data/lib/generators/jinda/templates/docker-compose.yml +10 -14
- data/lib/generators/jinda/templates/spec/controllers/api/v1_get_index_spec.rb +15 -14
- data/lib/generators/jinda/templates/spec/controllers/api/v1_get_my_spec.rb +9 -4
- data/lib/generators/jinda/templates/spec/controllers/api/v1_post_spec.rb +4 -3
- data/lib/generators/jinda/templates/spec/controllers/sessions_controller_spec.rb +82 -90
- data/lib/generators/jinda/templates/spec/features/userlogins_spec.rb +12 -15
- data/lib/generators/jinda/templates/spec/mailers/note_spec.rb +5 -8
- data/lib/generators/jinda/templates/spec/mailers/previews/note_preview.rb +3 -5
- data/lib/generators/jinda/templates/spec/models/note_spec.rb +36 -35
- data/lib/generators/jinda/templates/spec/models/user_spec.rb +10 -8
- data/lib/generators/jinda/templates/spec/rails_helper.rb +29 -31
- data/lib/generators/jinda/templates/spec/spec_helper.rb +19 -17
- data/lib/generators/jinda/templates/spec/support/authentication_helper.rb +8 -7
- data/lib/generators/jinda/templates/spec/support/databasecleaner.rb +3 -1
- data/lib/generators/jinda/templates/spec/support/factory_bot.rb +7 -5
- data/lib/generators/jinda/templates/spec/support/omniauth_macros.rb +14 -19
- data/lib/generators/jinda/templates/spec/support/request_spec_helper.rb +3 -1
- data/lib/generators/jinda/templates/spec/views/articles/_article.html.erb_spec.rbx +9 -8
- data/lib/generators/jinda/templates/test/application_system_test_case.rb +3 -1
- data/lib/generators/jinda/templates/test/integration/jinda_routes_test.rb +16 -21
- data/lib/generators/jinda/templates/test/test_helper.rb +7 -3
- data/lib/jinda/date_helpers.rb +50 -41
- data/lib/jinda/gem_helpers.rb +10 -8
- data/lib/jinda/gen_class.rb +14 -12
- data/lib/jinda/gen_controller.rb +9 -8
- data/lib/jinda/gen_freemind.rb +33 -32
- data/lib/jinda/gen_helpers.rb +146 -139
- data/lib/jinda/gen_models.rb +125 -131
- data/lib/jinda/gen_modules.rb +21 -16
- data/lib/jinda/gen_runseq.rb +71 -67
- data/lib/jinda/gen_services.rb +74 -80
- data/lib/jinda/gen_xmain.rb +38 -36
- data/lib/jinda/get_app.rb +31 -29
- data/lib/jinda/helpers.rb +4 -4
- data/lib/jinda/init_vars.rb +41 -36
- data/lib/jinda/mindmap_converter.rb +196 -0
- data/lib/jinda/railtie.rb +10 -2
- data/lib/jinda/rake_views.rb +61 -60
- data/lib/jinda/refresh.rb +67 -61
- data/lib/jinda/themes.rb +80 -60
- data/lib/jinda/version.rb +3 -1
- data/lib/jinda.rb +2 -0
- data/lib/tasks/jinda.rake +25 -22
- data/test/INTEGRATION_TEST_README.md +374 -0
- data/test/LOCAL_DEVELOPMENT.md +345 -0
- data/test/README.md +243 -0
- data/test/TEST_INFRASTRUCTURE.md +412 -0
- data/test/TEST_INSTALLATION_SH_FIXES.md +205 -0
- data/test/UNIT_TESTS_README.md +366 -0
- data/test/api_notes_controller_test.rb +231 -0
- data/test/dummy/DOCKER.md +188 -0
- data/test/dummy/Dockerfile +15 -7
- data/test/dummy/Gemfile +38 -29
- data/test/dummy/Gemfile.lock +671 -292
- data/test/dummy/app/assets/config/manifest.js +4 -0
- data/test/dummy/app/channels/application_cable/channel.rb +2 -0
- data/test/dummy/app/channels/application_cable/connection.rb +2 -0
- data/test/dummy/app/controllers/admins_controller.rb +4 -2
- data/test/dummy/app/controllers/api/v1/notes_controller.rb +80 -78
- data/test/dummy/app/controllers/application_controller.rb +11 -9
- data/test/dummy/app/controllers/articles_controller.rb +40 -44
- data/test/dummy/app/controllers/comments_controller.rb +10 -8
- data/test/dummy/app/controllers/ctrs_controller.rb +2 -0
- data/test/dummy/app/controllers/devs_controller.rb +2 -0
- data/test/dummy/app/controllers/docs_controller.rb +23 -24
- data/test/dummy/app/controllers/identities_controller.rb +3 -1
- data/test/dummy/app/controllers/mindmap_editor_controller.rb +74 -0
- data/test/dummy/app/controllers/notes_controller.rb +25 -27
- data/test/dummy/app/controllers/password_resets_controller.rb +16 -18
- data/test/dummy/app/controllers/sessions_controller.rb +13 -14
- data/test/dummy/app/controllers/sitemap_controller.rb +4 -4
- data/test/dummy/app/controllers/users_controller.rb +14 -14
- data/test/dummy/app/helpers/admins_helper.rb +2 -0
- data/test/dummy/app/helpers/application_helper.rb +21 -20
- data/test/dummy/app/helpers/articles_helper.rb +2 -0
- data/test/dummy/app/helpers/basic_helper.rb +2 -0
- data/test/dummy/app/helpers/comments_helper.rb +2 -0
- data/test/dummy/app/helpers/ctrs_helper.rb +2 -0
- data/test/dummy/app/helpers/devs_helper.rb +2 -0
- data/test/dummy/app/helpers/mindmap_editor_helper.rb +3 -0
- data/test/dummy/app/helpers/pictures_helper.rb +2 -0
- data/test/dummy/app/helpers/sitemap_helper.rb +2 -0
- data/test/dummy/app/helpers/users_helper.rb +2 -0
- data/test/dummy/app/jinda/index.mm +384 -486
- data/test/dummy/app/jinda/template/index.mm +1 -0
- data/test/dummy/app/mailers/application_mailer.rb +2 -2
- data/test/dummy/app/mailers/application_mailer.rb-org +4 -0
- data/test/dummy/app/mailers/jinda_mailer.rb +5 -3
- data/test/dummy/app/mailers/note_mailer.rb +6 -4
- data/test/dummy/app/mailers/user_mailer.rb +5 -5
- data/test/dummy/app/models/address.rb +2 -0
- data/test/dummy/app/models/article.rb +2 -0
- data/test/dummy/app/models/comment.rb +3 -2
- data/test/dummy/app/models/identity.rb +11 -10
- data/test/dummy/app/models/jinda/doc.rb +36 -33
- data/test/dummy/app/models/jinda/jinda_module.rb +15 -0
- data/test/dummy/app/models/jinda/module.rb +14 -10
- data/test/dummy/app/models/jinda/notice.rb +15 -11
- data/test/dummy/app/models/jinda/role.rb +11 -7
- data/test/dummy/app/models/jinda/runseq.rb +23 -20
- data/test/dummy/app/models/jinda/service.rb +19 -15
- data/test/dummy/app/models/jinda/xmain.rb +42 -36
- data/test/dummy/app/models/note.rb +3 -8
- data/test/dummy/app/models/param.rb +23 -20
- data/test/dummy/app/models/person.rb +2 -0
- data/test/dummy/app/models/picture.rb +11 -0
- data/test/dummy/app/models/user.rb +42 -41
- data/test/dummy/app/views/admins/index.haml +21 -0
- data/test/dummy/app/views/api/v1/notes/delete/select_note.html.erb +21 -0
- data/test/dummy/app/views/api/v1/notes/edit/edit_note.html.erb +21 -0
- data/test/dummy/app/views/api/v1/notes/index.haml +21 -0
- data/test/dummy/app/views/api/v1/notes/new/new_note.html.erb +21 -0
- data/test/dummy/app/views/articles/show.html.haml +2 -2
- data/test/dummy/app/views/devs/index.haml +21 -0
- data/test/dummy/app/views/jinda/feed.rss.builder +15 -13
- data/test/dummy/app/views/jinda/index.html.haml +3 -2
- data/test/dummy/app/views/layouts/application.haml +2 -2
- data/test/dummy/app/views/mindmap_editor/edit.html.haml +126 -0
- data/test/dummy/app/views/mindmap_editor/save.html.haml +2 -0
- data/test/dummy/bin/docker-entrypoint +3 -0
- data/test/dummy/bin/lint_modified +21 -0
- data/test/dummy/bin/setup +1 -1
- data/test/dummy/config/application.rb +7 -2
- data/test/dummy/config/boot.rb +2 -1
- data/test/dummy/config/cable.yml +1 -1
- data/test/dummy/config/credentials.yml.enc +1 -1
- data/test/dummy/config/environments/development.rb +7 -1
- data/test/dummy/config/environments/production.rb +30 -26
- data/test/dummy/config/environments/test.rb +12 -8
- data/test/dummy/config/initializers/content_security_policy.rb +2 -2
- data/test/dummy/config/initializers/filter_parameter_logging.rb +3 -3
- data/test/dummy/config/initializers/mindmap_converter.rb +5 -0
- data/test/dummy/config/initializers/mongoid.rb +24 -9
- data/test/dummy/config/initializers/omniauth.rb +5 -0
- data/test/dummy/config/initializers/permissions_policy.rb +11 -9
- data/test/dummy/config/locales/en.yml +11 -13
- data/test/dummy/config/mongoid.yml +172 -53
- data/test/dummy/config/mongoid.yml-docker +3 -3
- data/test/dummy/config/mongoid.yml-localhost +3 -3
- data/test/dummy/config/puma.rb +21 -20
- data/test/dummy/config/routes.rb +7 -1
- data/test/dummy/docker-compose-mongodb.yml +13 -0
- data/test/dummy/docker-compose-web.yml +36 -0
- data/test/dummy/docker-compose.yml +10 -18
- data/test/dummy/log/development.log +5834 -2261
- data/test/dummy/spec/controllers/api/v1_get_index_spec.rb +15 -14
- data/test/dummy/spec/controllers/api/v1_get_my_spec.rb +9 -4
- data/test/dummy/spec/controllers/api/v1_post_spec.rb +4 -3
- data/test/dummy/spec/controllers/sessions_controller_spec.rb +82 -90
- data/test/dummy/spec/factories/pictures.rb +5 -0
- data/test/dummy/spec/features/userlogins_spec.rb +12 -15
- data/test/dummy/spec/mailers/note_spec.rb +5 -8
- data/test/dummy/spec/mailers/previews/note_preview.rb +3 -5
- data/test/dummy/spec/models/note_spec.rb +36 -35
- data/test/dummy/spec/models/picture_spec.rb +5 -0
- data/test/dummy/spec/models/user_spec.rb +10 -8
- data/test/dummy/spec/rails_helper.rb +29 -31
- data/test/dummy/spec/requests/ctrs_spec.rb +7 -0
- data/test/dummy/spec/requests/devs_spec.rb +7 -0
- data/test/dummy/spec/spec_helper.rb +19 -17
- data/test/dummy/spec/support/authentication_helper.rb +8 -7
- data/test/dummy/spec/support/databasecleaner.rb +3 -1
- data/test/dummy/spec/support/factory_bot.rb +7 -5
- data/test/dummy/spec/support/omniauth_macros.rb +14 -19
- data/test/dummy/spec/support/request_spec_helper.rb +3 -1
- data/test/dummy/spec/views/articles/_article.html.erb_spec.rbx +9 -8
- data/test/generated_app_test.rb +261 -0
- data/test/installation_test.rb +368 -0
- data/test/integration_test.rb +398 -0
- data/test/jenkins_stage_test.rb +182 -0
- data/test/note_model_test.rb +224 -0
- data/test/note_validation_integration_test.rb +292 -0
- data/test/run_unit_tests.sh +91 -0
- data/test/test_helper.rb +8 -16
- metadata +188 -60
- data/lib/generators/jinda/templates/app/assets/stylesheets/application.css.scss +0 -15
- data/lib/generators/jinda/templates/app/controllers/jinda_org/password_resets.rb +0 -28
- data/lib/generators/jinda/templates/app/views/layouts/_head.html.erb +0 -10
- data/lib/generators/jinda/templates/app/views/layouts/_meta_tag.html.erb +0 -19
- data/lib/generators/jinda/templates/app/views/layouts/bsb/_footer.haml +0 -7
- data/lib/generators/jinda/templates/app/views/layouts/bsb/_header.haml +0 -147
- data/lib/generators/jinda/templates/app/views/layouts/bsb/_menu.haml +0 -47
- data/lib/generators/jinda/templates/app/views/layouts/bsb/_menu_mm.haml +0 -34
- data/lib/generators/jinda/templates/app/views/layouts/bsb/_sidebar.haml +0 -155
- data/lib/generators/jinda/templates/app/views/layouts/bsb/application.haml-bsb +0 -47
- data/lib/generators/jinda/templates/app/views/layouts/gmail.html.erb +0 -9
- data/lib/generators/jinda/templates/app/views/layouts/jqm/_full.haml +0 -33
- data/lib/generators/jinda/templates/app/views/layouts/jqm/_page.haml +0 -16
- data/lib/generators/jinda/templates/app/views/layouts/jqm/application.haml-jqm +0 -4
- data/lib/generators/jinda/templates/app/views/layouts/mailer.html.erb +0 -13
- data/lib/generators/jinda/templates/app/views/layouts/mailer.html.haml +0 -3
- data/lib/generators/jinda/templates/app/views/layouts/mailer.text.erb +0 -1
- data/lib/generators/jinda/templates/app/views/layouts/mailer.text.haml +0 -1
- data/lib/generators/jinda/templates/app/views/layouts/mobile.html.erb +0 -13
- data/lib/generators/jinda/templates/app/views/layouts/mobilejq.html.erb +0 -31
- data/lib/generators/jinda/templates/app/views/layouts/print.html.erb +0 -22
- data/lib/generators/jinda/templates/app/views/layouts/utf8.html.erb +0 -22
- data/lib/generators/jinda/templates/config/initializers/fix_mongoid_generator.rb-org +0 -14
- data/test/dummy/Guardfile +0 -96
- data/test/dummy/app/controllers/application_controller.rb.bak +0 -2
- data/test/dummy/app/controllers/password_resets.rb +0 -28
- data/test/dummy/app/helpers/application_helper.rb.bak +0 -2
- data/test/dummy/app/views/identities/new-bak.html.haml +0 -32
- data/test/dummy/app/views/layouts/application.haml.bak +0 -4
- data/test/dummy/app/views/layouts/application.html.erb.bak +0 -15
- data/test/dummy/app/views/layouts/lte/_header.haml +0 -111
- data/test/dummy/app/views/layouts/lte/_rightbar.haml +0 -123
- data/test/dummy/app/views/sessions/new-bak.html.haml +0 -22
- data/test/dummy/config/initializers/fix_mongoid_generator.rb-org +0 -14
- data/test/dummy/tmp/development_secret.txt +0 -1
- data/test/integration/navigation_test.rb +0 -7
- data/test/jinda_test.rb +0 -7
- /data/{test/dummy → lib/generators/jinda/templates}/app/assets/stylesheets/application.scss +0 -0
- /data/{test/dummy → lib/generators/jinda/templates}/app/assets/stylesheets/jinda.scss +0 -0
- /data/lib/generators/jinda/templates/app/mailers/{application_mailer.rb → application_mailer.rb-org} +0 -0
- /data/{test/dummy → lib/generators/jinda/templates}/app/views/adminltes/dashboard1.haml +0 -0
- /data/{test/dummy → lib/generators/jinda/templates}/app/views/adminltes/dashboard2.haml +0 -0
- /data/{test/dummy → lib/generators/jinda/templates}/app/views/layouts/lte/_flash.haml +0 -0
- /data/{test/dummy → lib/generators/jinda/templates}/app/views/layouts/lte/_footer.haml +0 -0
- /data/{test/dummy → lib/generators/jinda/templates}/app/views/layouts/lte/_menu.haml +0 -0
- /data/{test/dummy → lib/generators/jinda/templates}/app/views/layouts/lte/_menu_mm.haml +0 -0
- /data/lib/generators/jinda/templates/app/views/layouts/{bsb → lte}/_rightbar.haml +0 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'minitest/autorun'
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
|
|
6
|
+
# Test suite for Note model RSpec tests
|
|
7
|
+
#
|
|
8
|
+
# This test verifies that the Note model spec template:
|
|
9
|
+
# - Tests Note creation with user association
|
|
10
|
+
# - Tests validation rules
|
|
11
|
+
# - Tests auto-fill behavior
|
|
12
|
+
#
|
|
13
|
+
# Usage:
|
|
14
|
+
# ruby test/note_model_test.rb
|
|
15
|
+
#
|
|
16
|
+
class NoteModelTest < Minitest::Test
|
|
17
|
+
JINDA_ROOT = File.expand_path('..', __dir__)
|
|
18
|
+
NOTE_MODEL_PATH = File.join(JINDA_ROOT, 'lib/generators/jinda/templates/app/models/note.rb')
|
|
19
|
+
NOTE_SPEC_PATH = File.join(JINDA_ROOT, 'lib/generators/jinda/templates/spec/models/note_spec.rb')
|
|
20
|
+
|
|
21
|
+
def test_01_note_model_exists
|
|
22
|
+
assert File.exist?(NOTE_MODEL_PATH),
|
|
23
|
+
'Note model template should exist'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_02_note_spec_exists
|
|
27
|
+
assert File.exist?(NOTE_SPEC_PATH),
|
|
28
|
+
'Note spec template should exist'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_03_note_model_includes_mongoid
|
|
32
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
33
|
+
|
|
34
|
+
assert_includes content, 'include Mongoid::Document',
|
|
35
|
+
'Note should include Mongoid::Document'
|
|
36
|
+
assert_includes content, 'include Mongoid::Timestamps',
|
|
37
|
+
'Note should include timestamps'
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_04_note_model_has_required_fields
|
|
41
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
42
|
+
|
|
43
|
+
assert_includes content, 'field :title, type: String',
|
|
44
|
+
'Note should have title field'
|
|
45
|
+
assert_includes content, 'field :body, type: String',
|
|
46
|
+
'Note should have body field'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_05_note_model_belongs_to_user
|
|
50
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
51
|
+
|
|
52
|
+
assert_includes content, 'belongs_to :user',
|
|
53
|
+
'Note should belong to user'
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_06_note_model_has_validations
|
|
57
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
58
|
+
|
|
59
|
+
assert_includes content, 'validates :title',
|
|
60
|
+
'Note should validate title'
|
|
61
|
+
assert_includes content, 'length: { maximum:',
|
|
62
|
+
'Title should have length validation'
|
|
63
|
+
assert_includes content, 'presence: true',
|
|
64
|
+
'Title should be required'
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_07_note_model_has_title_length_constant
|
|
68
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
69
|
+
|
|
70
|
+
assert_includes content, 'MAX_TITLE_LENGTH = 30',
|
|
71
|
+
'Should define MAX_TITLE_LENGTH constant'
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_08_note_model_has_body_length_constant
|
|
75
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
76
|
+
|
|
77
|
+
assert_includes content, 'MAX_BODY_LENGTH',
|
|
78
|
+
'Should define MAX_BODY_LENGTH constant'
|
|
79
|
+
assert_includes content, '1000',
|
|
80
|
+
'MAX_BODY_LENGTH should be 1000'
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_09_note_model_has_before_validation_callback
|
|
84
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
85
|
+
|
|
86
|
+
assert_includes content, 'before_validation :ensure_title_has_a_value',
|
|
87
|
+
'Note should have before_validation callback'
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_10_note_model_has_ensure_title_method
|
|
91
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
92
|
+
|
|
93
|
+
assert_includes content, 'def ensure_title_has_a_value',
|
|
94
|
+
'Note should have ensure_title_has_a_value method'
|
|
95
|
+
assert_includes content, 'self.title = body[0..(MAX_TITLE_LENGTH - 1)]',
|
|
96
|
+
'Method should auto-fill title from body'
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_11_spec_creates_admin_user
|
|
100
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
101
|
+
|
|
102
|
+
assert_includes content, 'let!(:admin_user)',
|
|
103
|
+
'Spec should create admin_user'
|
|
104
|
+
assert_includes content, "User.create",
|
|
105
|
+
'Should create User instance'
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def test_12_spec_tests_note_with_title_and_body
|
|
109
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
110
|
+
|
|
111
|
+
assert_includes content, 'valid with both title and body',
|
|
112
|
+
'Spec should test valid note with title and body'
|
|
113
|
+
assert_includes content, 'Note.create(title:',
|
|
114
|
+
'Should create note with title'
|
|
115
|
+
assert_includes content, 'user: admin_user',
|
|
116
|
+
'Should associate note with user'
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def test_13_spec_tests_note_with_only_title
|
|
120
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
121
|
+
|
|
122
|
+
assert_includes content, 'valid with only title',
|
|
123
|
+
'Spec should test note with only title'
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def test_14_spec_tests_note_with_only_body
|
|
127
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
128
|
+
|
|
129
|
+
assert_includes content, 'invalid with only body',
|
|
130
|
+
'Spec should test invalid note with only body'
|
|
131
|
+
assert_includes content, 'Note.new(body:',
|
|
132
|
+
'Should use Note.new for invalid case'
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def test_15_spec_tests_body_length_validation
|
|
136
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
137
|
+
|
|
138
|
+
assert_includes content, 'invalid body length more than 1000',
|
|
139
|
+
'Spec should test body length validation'
|
|
140
|
+
assert_includes content, "'y' * 1001",
|
|
141
|
+
'Should test with 1001 characters'
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def test_16_spec_tests_title_autofill_from_body
|
|
145
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
146
|
+
|
|
147
|
+
assert_includes content, 'title data blank',
|
|
148
|
+
'Spec should have section for blank title'
|
|
149
|
+
assert_includes content, 'auto fill from body',
|
|
150
|
+
'Spec should test auto-fill behavior'
|
|
151
|
+
assert_includes content, "title: ''",
|
|
152
|
+
'Should test with empty title'
|
|
153
|
+
assert_includes content, "body: 'Body content'",
|
|
154
|
+
'Should provide body content'
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def test_17_spec_verifies_title_equals_body
|
|
158
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
159
|
+
|
|
160
|
+
assert_includes content, "note.title.should == 'Body content'",
|
|
161
|
+
'Spec should verify title equals body when auto-filled'
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def test_18_spec_checks_note_count_changes
|
|
165
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
166
|
+
|
|
167
|
+
assert_includes content, 'before_count = Note.count',
|
|
168
|
+
'Spec should track note count before creation'
|
|
169
|
+
assert_includes content, 'expect(Note.count)',
|
|
170
|
+
'Spec should verify note count changes'
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def test_19_note_model_validates_presence_when_user_present
|
|
174
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
175
|
+
|
|
176
|
+
# Ensure validations are defined
|
|
177
|
+
assert_match(/validates :title.*presence: true/m, content,
|
|
178
|
+
'Title should be validated for presence')
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def test_20_spec_always_includes_user_in_tests
|
|
182
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
183
|
+
|
|
184
|
+
# Count how many times Note.create or Note.new is called
|
|
185
|
+
create_calls = content.scan(/Note\.create/).length
|
|
186
|
+
new_calls = content.scan(/Note\.new/).length
|
|
187
|
+
total_note_calls = create_calls + new_calls
|
|
188
|
+
|
|
189
|
+
# Count how many times user parameter is passed
|
|
190
|
+
user_params = content.scan(/user: admin_user/).length
|
|
191
|
+
|
|
192
|
+
# All Note operations should include user (user: admin_user appears once per operation)
|
|
193
|
+
assert_equal total_note_calls, user_params,
|
|
194
|
+
'All Note.create and Note.new calls should include user parameter'
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def test_21_note_model_in_jinda_markers
|
|
198
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
199
|
+
|
|
200
|
+
assert_includes content, '# jinda begin',
|
|
201
|
+
'Note model should have jinda begin marker'
|
|
202
|
+
assert_includes content, '# jinda end',
|
|
203
|
+
'Note model should have jinda end marker'
|
|
204
|
+
|
|
205
|
+
# Extract content between markers
|
|
206
|
+
jinda_content = content[/# jinda begin(.*)# jinda end/m, 1]
|
|
207
|
+
|
|
208
|
+
assert_includes jinda_content, 'belongs_to :user',
|
|
209
|
+
'User association should be in jinda markers'
|
|
210
|
+
assert_includes jinda_content, 'validates :title',
|
|
211
|
+
'Validations should be in jinda markers'
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def test_22_spec_uses_rspec_syntax
|
|
215
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
216
|
+
|
|
217
|
+
assert_includes content, "require 'rails_helper'",
|
|
218
|
+
'Spec should require rails_helper'
|
|
219
|
+
assert_includes content, 'RSpec.describe Note',
|
|
220
|
+
'Spec should use RSpec.describe'
|
|
221
|
+
assert_includes content, 'type: :model',
|
|
222
|
+
'Spec should specify model type'
|
|
223
|
+
end
|
|
224
|
+
end
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'minitest/autorun'
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
|
|
6
|
+
# Integration test suite for Note model validations with User context
|
|
7
|
+
#
|
|
8
|
+
# This test verifies that Note model validations function correctly
|
|
9
|
+
# when a user is present, covering:
|
|
10
|
+
# - Title length validation (max 30 chars)
|
|
11
|
+
# - Body length validation (max 1000 chars)
|
|
12
|
+
# - Title auto-fill from body when title is blank
|
|
13
|
+
# - Presence validation for title
|
|
14
|
+
# - User association requirement
|
|
15
|
+
#
|
|
16
|
+
# Usage:
|
|
17
|
+
# ruby test/note_validation_integration_test.rb
|
|
18
|
+
#
|
|
19
|
+
class NoteValidationIntegrationTest < Minitest::Test
|
|
20
|
+
JINDA_ROOT = File.expand_path('..', __dir__)
|
|
21
|
+
NOTE_MODEL_PATH = File.join(JINDA_ROOT, 'lib/generators/jinda/templates/app/models/note.rb')
|
|
22
|
+
NOTE_SPEC_PATH = File.join(JINDA_ROOT, 'lib/generators/jinda/templates/spec/models/note_spec.rb')
|
|
23
|
+
|
|
24
|
+
def test_01_title_presence_validation_exists
|
|
25
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
26
|
+
|
|
27
|
+
assert_includes content, 'validates :title',
|
|
28
|
+
'Note model should validate title'
|
|
29
|
+
assert_includes content, 'presence: true',
|
|
30
|
+
'Title should have presence validation'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_02_title_length_validation_is_30_chars
|
|
34
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
35
|
+
|
|
36
|
+
assert_includes content, 'MAX_TITLE_LENGTH = 30',
|
|
37
|
+
'Maximum title length should be 30'
|
|
38
|
+
assert_includes content, 'length: { maximum: (MAX_TITLE_LENGTH = 30)',
|
|
39
|
+
'Title validation should use MAX_TITLE_LENGTH constant'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_03_title_length_validation_has_custom_message
|
|
43
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
44
|
+
|
|
45
|
+
title_validation = content[/validates :title.*?\n\s*validates|validates :title.*?end/m]
|
|
46
|
+
|
|
47
|
+
assert_includes title_validation, 'message:',
|
|
48
|
+
'Title validation should have custom message'
|
|
49
|
+
assert_includes title_validation, 'less than 30',
|
|
50
|
+
'Message should mention 30 character limit'
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_04_body_length_validation_is_1000_chars
|
|
54
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
55
|
+
|
|
56
|
+
assert_includes content, 'MAX_BODY_LENGTH = 1000',
|
|
57
|
+
'Maximum body length should be 1000'
|
|
58
|
+
assert_includes content, 'validates :body',
|
|
59
|
+
'Should validate body field'
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_05_body_length_validation_has_custom_message
|
|
63
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
64
|
+
|
|
65
|
+
body_validation = content[/validates :body.*?\n/]
|
|
66
|
+
|
|
67
|
+
assert_includes body_validation, 'message:',
|
|
68
|
+
'Body validation should have custom message'
|
|
69
|
+
assert_includes body_validation, 'less than 1000',
|
|
70
|
+
'Message should mention 1000 character limit'
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_06_title_autofill_before_validation_callback
|
|
74
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
75
|
+
|
|
76
|
+
assert_includes content, 'before_validation :ensure_title_has_a_value',
|
|
77
|
+
'Should have before_validation callback for title autofill'
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_07_autofill_method_checks_title_presence
|
|
81
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
82
|
+
|
|
83
|
+
ensure_method = content[/def ensure_title_has_a_value.*?end/m]
|
|
84
|
+
|
|
85
|
+
assert_includes ensure_method, 'return if title.present?',
|
|
86
|
+
'Should return early if title is already present'
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def test_08_autofill_method_uses_body_substring
|
|
90
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
91
|
+
|
|
92
|
+
ensure_method = content[/def ensure_title_has_a_value.*?end/m]
|
|
93
|
+
|
|
94
|
+
assert_includes ensure_method, 'body[0..(MAX_TITLE_LENGTH - 1)]',
|
|
95
|
+
'Should take first 29 characters of body (0..29)'
|
|
96
|
+
assert_includes ensure_method, 'if body.present?',
|
|
97
|
+
'Should only autofill if body is present'
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_09_autofill_sets_title_to_self
|
|
101
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
102
|
+
|
|
103
|
+
ensure_method = content[/def ensure_title_has_a_value.*?end/m]
|
|
104
|
+
|
|
105
|
+
assert_includes ensure_method, 'self.title =',
|
|
106
|
+
'Should assign to self.title'
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_10_spec_tests_valid_note_with_user
|
|
110
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
111
|
+
|
|
112
|
+
# Should test creating valid note with user
|
|
113
|
+
assert_includes content, 'Note.create(title:',
|
|
114
|
+
'Spec should create notes with title'
|
|
115
|
+
assert_includes content, 'user: admin_user',
|
|
116
|
+
'Spec should always include user in creation'
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def test_11_spec_tests_title_only_with_user
|
|
120
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
121
|
+
|
|
122
|
+
title_only_test = content[/'valid with only title'.*?end/m]
|
|
123
|
+
|
|
124
|
+
assert_includes title_only_test, 'Note.create(title:',
|
|
125
|
+
'Should test note creation with only title'
|
|
126
|
+
assert_includes title_only_test, 'user: admin_user',
|
|
127
|
+
'Title-only test should include user'
|
|
128
|
+
assert_includes title_only_test, 'expect(Note.count).not_to eq(before_count)',
|
|
129
|
+
'Should verify note was created successfully'
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def test_12_spec_tests_body_only_invalid_with_user
|
|
133
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
134
|
+
|
|
135
|
+
body_only_test = content[/'invalid with only body'.*?end/m]
|
|
136
|
+
|
|
137
|
+
assert_includes body_only_test, 'Note.new(body:',
|
|
138
|
+
'Should use Note.new for invalid case'
|
|
139
|
+
assert_includes body_only_test, 'user: admin_user',
|
|
140
|
+
'Body-only test should include user'
|
|
141
|
+
assert_includes body_only_test, 'expect(Note.count).to eq(before_count)',
|
|
142
|
+
'Should verify note was NOT created (invalid)'
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def test_13_spec_tests_title_length_exceeds_30
|
|
146
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
147
|
+
|
|
148
|
+
# Note: current spec tests body length > 1000, not title > 30
|
|
149
|
+
# but we should verify the spec structure
|
|
150
|
+
length_test = content[/'invalid body length more than 1000'.*?end/m]
|
|
151
|
+
|
|
152
|
+
assert_includes length_test, 'user: admin_user',
|
|
153
|
+
'Length validation test should include user'
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def test_14_spec_tests_autofill_with_user_present
|
|
157
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
158
|
+
|
|
159
|
+
autofill_test = content[/'auto fill from body'.*?end/m]
|
|
160
|
+
|
|
161
|
+
assert_includes autofill_test, "title: ''",
|
|
162
|
+
'Autofill test should use empty title'
|
|
163
|
+
assert_includes autofill_test, "body: 'Body content'",
|
|
164
|
+
'Autofill test should provide body'
|
|
165
|
+
assert_includes autofill_test, 'user: admin_user',
|
|
166
|
+
'Autofill test should include user'
|
|
167
|
+
assert_includes autofill_test, "note.title.should == 'Body content'",
|
|
168
|
+
'Should verify title equals body after autofill'
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def test_15_all_validations_work_with_user_context
|
|
172
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
173
|
+
|
|
174
|
+
# Verify that validations don't have conditional logic excluding user context
|
|
175
|
+
validations_section = content[/validates :title.*?validates :body.*?\n/m]
|
|
176
|
+
|
|
177
|
+
refute_includes validations_section, 'if:',
|
|
178
|
+
'Validations should not be conditional on user presence'
|
|
179
|
+
refute_includes validations_section, 'unless:',
|
|
180
|
+
'Validations should not skip based on conditions'
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def test_16_user_association_is_required
|
|
184
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
185
|
+
|
|
186
|
+
assert_includes content, 'belongs_to :user',
|
|
187
|
+
'Note should belong to user'
|
|
188
|
+
|
|
189
|
+
# In Mongoid, belongs_to is required by default unless optional: true
|
|
190
|
+
belongs_to_line = content[/belongs_to :user.*$/]
|
|
191
|
+
refute_includes belongs_to_line, 'optional: true',
|
|
192
|
+
'User association should be required (not optional)'
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def test_17_spec_always_creates_admin_user_first
|
|
196
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
197
|
+
|
|
198
|
+
assert_includes content, 'let!(:admin_user)',
|
|
199
|
+
'Spec should use let! to create admin_user before tests'
|
|
200
|
+
|
|
201
|
+
# Verify admin_user is created before any test runs
|
|
202
|
+
admin_user_def = content[/let!\(:admin_user\).*?\}/m]
|
|
203
|
+
assert_includes admin_user_def, 'User.create',
|
|
204
|
+
'Should create User instance for admin_user'
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def test_18_spec_uses_before_count_pattern
|
|
208
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
209
|
+
|
|
210
|
+
# Verify the pattern used in specs
|
|
211
|
+
test_blocks = content.scan(/it '.*?' do.*?end/m)
|
|
212
|
+
|
|
213
|
+
valid_test_blocks = test_blocks.select { |block| block.include?('before_count') }
|
|
214
|
+
|
|
215
|
+
assert valid_test_blocks.any?,
|
|
216
|
+
'At least one test should use before_count pattern'
|
|
217
|
+
|
|
218
|
+
valid_test_blocks.each do |block|
|
|
219
|
+
assert_includes block, 'before_count = Note.count',
|
|
220
|
+
'Should capture count before operation'
|
|
221
|
+
assert_includes block, 'expect(Note.count)',
|
|
222
|
+
'Should check count after operation'
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def test_19_validations_cover_all_edge_cases
|
|
227
|
+
content = File.read(NOTE_SPEC_PATH)
|
|
228
|
+
|
|
229
|
+
# Verify spec covers key scenarios with user present
|
|
230
|
+
scenarios = [
|
|
231
|
+
'valid with both title and body',
|
|
232
|
+
'valid with only title',
|
|
233
|
+
'invalid with only body',
|
|
234
|
+
'invalid body length more than 1000',
|
|
235
|
+
'auto fill from body'
|
|
236
|
+
]
|
|
237
|
+
|
|
238
|
+
scenarios.each do |scenario|
|
|
239
|
+
assert_includes content, scenario,
|
|
240
|
+
"Spec should cover scenario: #{scenario}"
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def test_20_ensure_title_method_is_private
|
|
245
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
246
|
+
|
|
247
|
+
# Find the private keyword position
|
|
248
|
+
private_index = content.index('private')
|
|
249
|
+
ensure_method_index = content.index('def ensure_title_has_a_value')
|
|
250
|
+
|
|
251
|
+
refute_nil private_index, 'Model should have private section'
|
|
252
|
+
refute_nil ensure_method_index, 'Model should have ensure_title_has_a_value method'
|
|
253
|
+
assert ensure_method_index > private_index,
|
|
254
|
+
'ensure_title_has_a_value should be in private section'
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def test_21_model_uses_mongoid_document
|
|
258
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
259
|
+
|
|
260
|
+
assert_includes content, 'include Mongoid::Document',
|
|
261
|
+
'Note should include Mongoid::Document'
|
|
262
|
+
assert_includes content, 'include Mongoid::Timestamps',
|
|
263
|
+
'Note should include Mongoid::Timestamps'
|
|
264
|
+
assert_includes content, 'include Mongoid::Attributes::Dynamic',
|
|
265
|
+
'Note should include Dynamic attributes'
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def test_22_fields_are_typed_correctly
|
|
269
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
270
|
+
|
|
271
|
+
assert_includes content, 'field :title, type: String',
|
|
272
|
+
'Title should be String type'
|
|
273
|
+
assert_includes content, 'field :body, type: String',
|
|
274
|
+
'Body should be String type'
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def test_23_validation_errors_are_descriptive
|
|
278
|
+
content = File.read(NOTE_MODEL_PATH)
|
|
279
|
+
|
|
280
|
+
# Check custom error messages exist
|
|
281
|
+
title_message = content[/validates :title.*?message: '([^']+)'/m, 1]
|
|
282
|
+
body_message = content[/validates :body.*?message: '([^']+)'/m, 1]
|
|
283
|
+
|
|
284
|
+
refute_nil title_message, 'Title validation should have custom message'
|
|
285
|
+
refute_nil body_message, 'Body validation should have custom message'
|
|
286
|
+
|
|
287
|
+
assert_includes title_message, '30',
|
|
288
|
+
'Title message should mention character limit'
|
|
289
|
+
assert_includes body_message, '1000',
|
|
290
|
+
'Body message should mention character limit'
|
|
291
|
+
end
|
|
292
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Unit Test Runner for Jinda Gem
|
|
3
|
+
#
|
|
4
|
+
# This script runs all unit tests and provides a summary
|
|
5
|
+
# Usage: ./test/run_unit_tests.sh
|
|
6
|
+
|
|
7
|
+
set -e
|
|
8
|
+
|
|
9
|
+
JINDA_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
10
|
+
cd "$JINDA_ROOT"
|
|
11
|
+
|
|
12
|
+
echo "=========================================="
|
|
13
|
+
echo "Jinda Gem Unit Tests"
|
|
14
|
+
echo "=========================================="
|
|
15
|
+
echo ""
|
|
16
|
+
|
|
17
|
+
TOTAL_TESTS=0
|
|
18
|
+
FAILED_TESTS=0
|
|
19
|
+
FAILED_FILES=()
|
|
20
|
+
|
|
21
|
+
# Function to run a test file
|
|
22
|
+
run_test() {
|
|
23
|
+
local test_file="$1"
|
|
24
|
+
local test_name="$2"
|
|
25
|
+
|
|
26
|
+
echo "Running: $test_name"
|
|
27
|
+
echo " File: $test_file"
|
|
28
|
+
|
|
29
|
+
if ruby "$test_file"; then
|
|
30
|
+
echo " ✓ PASSED"
|
|
31
|
+
echo ""
|
|
32
|
+
return 0
|
|
33
|
+
else
|
|
34
|
+
echo " ✗ FAILED"
|
|
35
|
+
echo ""
|
|
36
|
+
FAILED_TESTS=$((FAILED_TESTS + 1))
|
|
37
|
+
FAILED_FILES+=("$test_name")
|
|
38
|
+
return 1
|
|
39
|
+
fi
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# Run static analysis tests (fast)
|
|
43
|
+
echo "--- Static Analysis Tests ---"
|
|
44
|
+
echo ""
|
|
45
|
+
|
|
46
|
+
run_test "test/jenkins_stage_test.rb" "Jenkins Stage Test"
|
|
47
|
+
run_test "test/note_model_test.rb" "Note Model Test"
|
|
48
|
+
run_test "test/api_notes_controller_test.rb" "API Notes Controller Test"
|
|
49
|
+
run_test "test/note_validation_integration_test.rb" "Note Validation Integration Test"
|
|
50
|
+
|
|
51
|
+
TOTAL_TESTS=4
|
|
52
|
+
|
|
53
|
+
# Optionally run integration tests (slow)
|
|
54
|
+
if [ "$RUN_INTEGRATION_TESTS" = "true" ]; then
|
|
55
|
+
echo "--- Integration Tests (Slow) ---"
|
|
56
|
+
echo ""
|
|
57
|
+
echo "Note: Integration tests require MongoDB running on port ${MONGODB_PORT:-27017}"
|
|
58
|
+
echo ""
|
|
59
|
+
|
|
60
|
+
if run_test "test/generated_app_test.rb" "Generated App Test"; then
|
|
61
|
+
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
|
62
|
+
else
|
|
63
|
+
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
|
64
|
+
fi
|
|
65
|
+
else
|
|
66
|
+
echo "--- Integration Tests ---"
|
|
67
|
+
echo "Skipped (set RUN_INTEGRATION_TESTS=true to run)"
|
|
68
|
+
echo ""
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
# Summary
|
|
72
|
+
echo "=========================================="
|
|
73
|
+
echo "Test Summary"
|
|
74
|
+
echo "=========================================="
|
|
75
|
+
echo "Total test suites: $TOTAL_TESTS"
|
|
76
|
+
echo "Passed: $((TOTAL_TESTS - FAILED_TESTS))"
|
|
77
|
+
echo "Failed: $FAILED_TESTS"
|
|
78
|
+
echo ""
|
|
79
|
+
|
|
80
|
+
if [ $FAILED_TESTS -gt 0 ]; then
|
|
81
|
+
echo "Failed test suites:"
|
|
82
|
+
for test in "${FAILED_FILES[@]}"; do
|
|
83
|
+
echo " - $test"
|
|
84
|
+
done
|
|
85
|
+
echo ""
|
|
86
|
+
exit 1
|
|
87
|
+
else
|
|
88
|
+
echo "✓ All tests passed!"
|
|
89
|
+
echo ""
|
|
90
|
+
exit 0
|
|
91
|
+
fi
|
data/test/test_helper.rb
CHANGED
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
#
|
|
2
|
-
ENV["RAILS_ENV"] = "test"
|
|
1
|
+
# frozen_string_literal: true
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
ActiveRecord::Migrator.migrations_paths = [File.expand_path("../test/dummy/db/migrate", __dir__)]
|
|
6
|
-
ActiveRecord::Migrator.migrations_paths << File.expand_path('../db/migrate', __dir__)
|
|
7
|
-
require "rails/test_help"
|
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __dir__)
|
|
8
4
|
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
require 'minitest/autorun'
|
|
6
|
+
require 'minitest/reporters'
|
|
11
7
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path
|
|
17
|
-
ActiveSupport::TestCase.file_fixture_path = ActiveSupport::TestCase.fixture_path + "/files"
|
|
18
|
-
ActiveSupport::TestCase.fixtures :all
|
|
19
|
-
end
|
|
8
|
+
# Use spec reporter for better output
|
|
9
|
+
Minitest::Reporters.use! [
|
|
10
|
+
Minitest::Reporters::SpecReporter.new(color: true)
|
|
11
|
+
]
|