scriptorium 0.0.3 → 0.7.2
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.lt3 +324 -0
- data/README.md +3155 -1
- data/assets/.DS_Store +0 -0
- data/assets/README.md +44 -0
- data/assets/icons/social/reddit.png +0 -0
- data/assets/icons/social/x-logo.png +0 -0
- data/assets/icons/ui/.DS_Store +0 -0
- data/assets/icons/ui/back.png +0 -0
- data/assets/icons/ui/copy.png +0 -0
- data/assets/icons/ui/down.png +0 -0
- data/assets/icons/ui/end.png +0 -0
- data/assets/icons/ui/exit.png +0 -0
- data/assets/icons/ui/foo +10 -0
- data/assets/icons/ui/home.png +0 -0
- data/assets/icons/ui/left.png +0 -0
- data/assets/icons/ui/next.png +0 -0
- data/assets/icons/ui/right.png +0 -0
- data/assets/icons/ui/start.png +0 -0
- data/assets/icons/ui/up.png +0 -0
- data/assets/imagenotfound.jpg +0 -0
- data/assets/samples/placeholder.svg +9 -0
- data/assets/themes/standard/favicon.svg +6 -0
- data/bin/sblog +84 -5
- data/bin/scriptorium +1 -0
- data/doc/README.txt +6 -0
- data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +94 -0
- data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +2 -0
- data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +45 -0
- data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +40 -0
- data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +46 -0
- data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +158 -0
- data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +35 -0
- data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +27 -0
- data/doc/anti-amnesia/20250807-213025.md +116 -0
- data/doc/anti-amnesia/20250901-211714-codemirror-integration-and-web-tests.md +172 -0
- data/doc/anti-amnesia/20250902-002402-backup-restore-system.md +126 -0
- data/doc/anti-amnesia/20250907-203339-backup-metadata-implementation.md +66 -0
- data/doc/banner_svg_config.md +114 -0
- data/doc/contrib.lt3 +8 -0
- data/doc/dependencies.md +281 -0
- data/doc/hacker.lt3 +5 -0
- data/doc/imported/0001-elixir-conf-2014/metadata.txt +7 -0
- data/doc/imported/0001-elixir-conf-2014/post.html +37 -0
- data/doc/imported/0001-elixir-conf-2014/source.lt3 +22 -0
- data/doc/imported/0002-programmers-and-word-processing/metadata.txt +7 -0
- data/doc/imported/0002-programmers-and-word-processing/post.html +192 -0
- data/doc/imported/0002-programmers-and-word-processing/source.lt3 +146 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/metadata.txt +7 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/post.html +60 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/source.lt3 +40 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/metadata.txt +7 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/post.html +42 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/source.lt3 +24 -0
- data/doc/imported/0005-elixir-conf-2015-announced/metadata.txt +7 -0
- data/doc/imported/0005-elixir-conf-2015-announced/post.html +30 -0
- data/doc/imported/0005-elixir-conf-2015-announced/source.lt3 +16 -0
- data/doc/imported/0006-ruby-for-dinosaurs/metadata.txt +7 -0
- data/doc/imported/0006-ruby-for-dinosaurs/post.html +43 -0
- data/doc/imported/0006-ruby-for-dinosaurs/source.lt3 +27 -0
- data/doc/imported/0007-phoenix-isnt-rails/metadata.txt +7 -0
- data/doc/imported/0007-phoenix-isnt-rails/post.html +116 -0
- data/doc/imported/0007-phoenix-isnt-rails/source.lt3 +87 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/metadata.txt +7 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/post.html +129 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/source.lt3 +92 -0
- data/doc/imported/0009-announcement-coming-soon/metadata.txt +7 -0
- data/doc/imported/0009-announcement-coming-soon/post.html +33 -0
- data/doc/imported/0009-announcement-coming-soon/source.lt3 +19 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/metadata.txt +7 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/post.html +175 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/source.lt3 +139 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/metadata.txt +7 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/post.html +139 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/source.lt3 +104 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/metadata.txt +7 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/post.html +42 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/source.lt3 +24 -0
- data/doc/imported/0013-rubyday-was-a-success/metadata.txt +7 -0
- data/doc/imported/0013-rubyday-was-a-success/post.html +44 -0
- data/doc/imported/0013-rubyday-was-a-success/source.lt3 +27 -0
- data/doc/imported/0014-working-on-the-blogging-software/metadata.txt +7 -0
- data/doc/imported/0014-working-on-the-blogging-software/post.html +63 -0
- data/doc/imported/0014-working-on-the-blogging-software/source.lt3 +41 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/metadata.txt +7 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/post.html +172 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/source.lt3 +134 -0
- data/doc/imported/0016-an-in-operator-for-ruby/metadata.txt +7 -0
- data/doc/imported/0016-an-in-operator-for-ruby/post.html +155 -0
- data/doc/imported/0016-an-in-operator-for-ruby/source.lt3 +106 -0
- data/doc/imported/0017-the-forgotten-mathematician/metadata.txt +7 -0
- data/doc/imported/0017-the-forgotten-mathematician/post.html +161 -0
- data/doc/imported/0017-the-forgotten-mathematician/source.lt3 +119 -0
- data/doc/imported/0018-ruby-puns/metadata.txt +7 -0
- data/doc/imported/0018-ruby-puns/post.html +46 -0
- data/doc/imported/0018-ruby-puns/source.lt3 +28 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/metadata.txt +7 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/post.html +138 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/source.lt3 +101 -0
- data/doc/imported/0020-fffff/metadata.txt +7 -0
- data/doc/imported/0020-fffff/post.html +24 -0
- data/doc/imported/0020-fffff/source.lt3 +12 -0
- data/doc/imported/0021-trying-ror-yet-again/metadata.txt +7 -0
- data/doc/imported/0021-trying-ror-yet-again/post.html +26 -0
- data/doc/imported/0021-trying-ror-yet-again/source.lt3 +12 -0
- data/doc/imported/0023-doctor-sleep/metadata.txt +7 -0
- data/doc/imported/0023-doctor-sleep/post.html +63 -0
- data/doc/imported/0023-doctor-sleep/source.lt3 +44 -0
- data/doc/imported/0024-just-a-test/metadata.txt +7 -0
- data/doc/imported/0024-just-a-test/post.html +24 -0
- data/doc/imported/0024-just-a-test/source.lt3 +12 -0
- data/doc/imported/import_summary.txt +98 -0
- data/doc/livetext-informal-spec.txt +65 -0
- data/doc/myuserdoc/ch-0.lt3 +31 -0
- data/doc/myuserdoc/ch-1.lt3 +37 -0
- data/doc/myuserdoc/ch-10.lt3 +22 -0
- data/doc/myuserdoc/ch-2.lt3 +37 -0
- data/doc/myuserdoc/ch-3.lt3 +19 -0
- data/doc/myuserdoc/ch-4.lt3 +43 -0
- data/doc/myuserdoc/ch-5.lt3 +22 -0
- data/doc/myuserdoc/ch-6.lt3 +19 -0
- data/doc/myuserdoc/ch-7.lt3 +16 -0
- data/doc/myuserdoc/ch-8.lt3 +13 -0
- data/doc/myuserdoc/ch-9.lt3 +19 -0
- data/doc/myuserdoc/tweak.rb +18 -0
- data/doc/myuserdoc/userdoc-toc.txt +88 -0
- data/doc/old-posts/0001-elixir-conf-2014.lt3 +24 -0
- data/doc/old-posts/0002-programmers-and-word-processing.lt3 +150 -0
- data/doc/old-posts/0003-how-to-turn-your-brain-sideways.lt3 +43 -0
- data/doc/old-posts/0004-upcoming-lone-star-ruby-conference.lt3 +26 -0
- data/doc/old-posts/0005-elixir-conf-2015-announced.lt3 +17 -0
- data/doc/old-posts/0006-ruby-for-dinosaurs.lt3 +30 -0
- data/doc/old-posts/0007-phoenix-isnt-rails.lt3 +90 -0
- data/doc/old-posts/0008-concerning-the-term-monkeypatching.lt3 +105 -0
- data/doc/old-posts/0009-announcement-coming-soon.lt3 +20 -0
- data/doc/old-posts/0010-immutable-data-ditching-the-wax-tablet.lt3 +142 -0
- data/doc/old-posts/0011-computer-science-as-a-lost-art.lt3 +117 -0
- data/doc/old-posts/0012-ruby-day-in-turin-italy.lt3 +26 -0
- data/doc/old-posts/0013-rubyday-was-a-success.lt3 +28 -0
- data/doc/old-posts/0014-working-on-the-blogging-software.lt3 +42 -0
- data/doc/old-posts/0015-ok-its-not-really-a-lost-art.lt3 +137 -0
- data/doc/old-posts/0016-an-in-operator-for-ruby.lt3 +142 -0
- data/doc/old-posts/0017-the-forgotten-mathematician.lt3 +129 -0
- data/doc/old-posts/0018-ruby-puns.lt3 +31 -0
- data/doc/old-posts/0019-custom-exceptions-via-metaprogramming.lt3 +116 -0
- data/doc/old-posts/0021-trying-ror-yet-again.lt3 +35 -0
- data/doc/old-posts/0023-doctor-sleep.lt3 +43 -0
- data/doc/old-posts/0024-just-a-test.lt3 +12 -0
- data/doc/old-posts/0025-trying-another-post.lt3 +12 -0
- data/doc/old-repo +1 -0
- data/doc/reddit_credentials_template.json +8 -0
- data/doc/reddit_integration.md +207 -0
- data/doc/user.lt3 +35 -0
- data/doc/user_guide_section_1.md +137 -0
- data/doc/user_guide_section_10.md +515 -0
- data/doc/user_guide_section_11.md +708 -0
- data/doc/user_guide_section_2.md +233 -0
- data/doc/user_guide_section_3.md +5 -0
- data/doc/user_guide_section_4.md +221 -0
- data/doc/user_guide_section_5.md +243 -0
- data/doc/user_guide_section_6.md +147 -0
- data/doc/user_guide_section_7.md +311 -0
- data/doc/user_guide_section_8.md +224 -0
- data/doc/user_guide_section_9.md +375 -0
- data/lib/rouge/lexers/livetext.rb +74 -0
- data/lib/scriptorium/api.rb +2373 -0
- data/lib/scriptorium/banner_svg.rb +729 -0
- data/lib/scriptorium/contract.rb +34 -0
- data/lib/scriptorium/exceptions.rb +201 -1
- data/lib/scriptorium/helpers.rb +675 -0
- data/lib/scriptorium/post.rb +259 -0
- data/lib/scriptorium/reddit.rb +83 -0
- data/lib/scriptorium/repo.rb +938 -0
- data/lib/scriptorium/standard_files.rb +149 -0
- data/lib/scriptorium/support/bootstrap/css.txt +5 -0
- data/lib/scriptorium/support/bootstrap/js.txt +4 -0
- data/lib/scriptorium/support/common_js/clipboard.js +35 -0
- data/lib/scriptorium/support/common_js/content-loader.js +187 -0
- data/lib/scriptorium/support/common_js/navigation.js +52 -0
- data/lib/scriptorium/support/common_js/syntax-highlighting.js +27 -0
- data/lib/scriptorium/support/config/reddit.txt +10 -0
- data/lib/scriptorium/support/config/reddit_template.txt +17 -0
- data/lib/scriptorium/support/config/social.txt +8 -0
- data/lib/scriptorium/support/highlight/css.txt +2 -0
- data/lib/scriptorium/support/highlight/custom.css +119 -0
- data/lib/scriptorium/support/highlight/js.txt +1 -0
- data/lib/scriptorium/support/post_index/config.txt +15 -0
- data/lib/scriptorium/support/post_index/style.css +55 -0
- data/lib/scriptorium/support/templates/index_entry.lt3 +16 -0
- data/lib/scriptorium/support/templates/initial_post.lt3 +12 -0
- data/lib/scriptorium/support/templates/layout.txt +5 -0
- data/lib/scriptorium/support/templates/post.lt3 +104 -0
- data/lib/scriptorium/support/theme/footer.lt3 +2 -0
- data/lib/scriptorium/support/theme/header.lt3 +4 -0
- data/lib/scriptorium/support/theme/left.lt3 +3 -0
- data/lib/scriptorium/support/theme/main.lt3 +5 -0
- data/lib/scriptorium/support/theme/right.lt3 +3 -0
- data/lib/scriptorium/theme.rb +192 -0
- data/lib/scriptorium/version.rb +1 -1
- data/lib/scriptorium/view.rb +1021 -0
- data/lib/scriptorium/widgets/featured_posts.rb +149 -0
- data/lib/scriptorium/widgets/links.rb +112 -0
- data/lib/scriptorium/widgets/pages.rb +133 -0
- data/lib/scriptorium/widgets/widget.rb +133 -0
- data/lib/scriptorium.rb +38 -34
- data/lib/skeleton.rb +10 -1
- data/scriptorium.gemspec +17 -5
- data/test/README.md +69 -0
- data/test/WEB_INTEGRATION_README.md +196 -0
- data/test/all +83 -0
- data/test/api_demo.rb +99 -0
- data/test/assets/imagenotfound.jpg +0 -0
- data/test/assets/images/.DS_Store +0 -0
- data/test/assets/images/README.md +27 -0
- data/test/assets/images/odd_aspect.png +0 -0
- data/test/assets/images/perfect.png +0 -0
- data/test/assets/images/small.png +0 -0
- data/test/assets/images/tall.png +0 -0
- data/test/assets/images/very_tall.png +0 -0
- data/test/assets/images/very_wide.png +0 -0
- data/test/assets/images/wide.png +0 -0
- data/test/assets/testbanner.jpg +0 -0
- data/test/banner_svg/simple_helpers.rb +13 -0
- data/test/banner_svg/unit.rb +1000 -0
- data/test/config/deployment.txt +5 -0
- data/test/ed_test.rb +204 -0
- data/test/integration/cursor_banner_combinations.rb +193 -0
- data/test/integration/cursor_banner_features.rb +374 -0
- data/test/integration/integration_test.rb +326 -0
- data/test/integration/preview_flow_test.rb +94 -0
- data/test/livetext_plugin_test.rb +500 -0
- data/test/manual/asset_mgmt.rb +67 -0
- data/test/manual/banner-tests/index.html +45 -0
- data/test/manual/banner-tests/svg.txt +3 -0
- data/test/manual/banner-tests/test01.html +122 -0
- data/test/manual/banner-tests/test02.html +122 -0
- data/test/manual/banner-tests/test03.html +122 -0
- data/test/manual/banner-tests/test04.html +129 -0
- data/test/manual/banner-tests/test05.html +129 -0
- data/test/manual/banner-tests/test06.html +129 -0
- data/test/manual/banner-tests/test07.html +129 -0
- data/test/manual/banner-tests/test08.html +123 -0
- data/test/manual/banner-tests/test09.html +123 -0
- data/test/manual/banner-tests/test10.html +123 -0
- data/test/manual/banner-tests/test11.html +123 -0
- data/test/manual/banner-tests/test12.html +123 -0
- data/test/manual/banner-tests/test13.html +123 -0
- data/test/manual/banner-tests/test14.html +123 -0
- data/test/manual/banner-tests/test15.html +122 -0
- data/test/manual/banner-tests/test16.html +122 -0
- data/test/manual/banner-tests/test17.html +122 -0
- data/test/manual/banner-tests/test18.html +132 -0
- data/test/manual/banner-tests/test19.html +132 -0
- data/test/manual/banner-tests/test20.html +132 -0
- data/test/manual/banner-tests/test21.html +132 -0
- data/test/manual/banner-tests/test22.html +132 -0
- data/test/manual/banner-tests/test23.html +132 -0
- data/test/manual/banner-tests/test24.html +132 -0
- data/test/manual/banner-tests/test25.html +131 -0
- data/test/manual/banner_environment.rb +205 -0
- data/test/manual/codemirror_demo.html +773 -0
- data/test/manual/create_posts_for_web.rb +114 -0
- data/test/manual/environment.rb +67 -0
- data/test/manual/make_banner.rb +153 -0
- data/test/manual/preview_manual_test.rb +129 -0
- data/test/manual/sample_banner_config.txt +12 -0
- data/test/manual/test_advanced_widgets.rb +73 -0
- data/test/manual/test_banner_combinations.rb +120 -0
- data/test/manual/test_banner_features.rb +306 -0
- data/test/manual/test_banner_integration.rb +115 -0
- data/test/manual/test_banner_radial.rb +87 -0
- data/test/manual/test_basic_posts.rb +47 -0
- data/test/manual/test_layout_widgets.rb +40 -0
- data/test/manual/test_pagination.rb +24 -0
- data/test/manual/test_random_posts.rb +38 -0
- data/test/manual/test_syntax_highlighting.rb +167 -0
- data/test/rubytext/rubytext_comprehensive_test.rb +307 -0
- data/test/rubytext/rubytext_demo_test.rb +42 -0
- data/test/rubytext/rubytext_testing_guide.md +277 -0
- data/test/run_automated_tests.rb +45 -0
- data/test/staging/.DS_Store +0 -0
- data/test/support/preview_utils.rb +88 -0
- data/test/syntax_highlighting_test.lt3 +124 -0
- data/test/test_gem_assets.rb +48 -0
- data/test/test_helpers.rb +240 -0
- data/test/tui_editor_integration_test.rb +296 -0
- data/test/tui_integration_test.rb +883 -0
- data/test/unit/api.rb +1776 -0
- data/test/unit/asset_management.rb +219 -0
- data/test/unit/backup_test.rb +451 -0
- data/test/unit/clipboard_test.rb +60 -0
- data/test/unit/contract_test.rb +69 -0
- data/test/unit/core.rb +1211 -0
- data/test/unit/deploy_config_test.rb +248 -0
- data/test/unit/deploy_test.rb +478 -0
- data/test/unit/edit_post_test.rb +168 -0
- data/test/unit/gem_asset_management.rb +183 -0
- data/test/unit/livetext_basic.rb +57 -0
- data/test/unit/livetext_compatibility.rb +82 -0
- data/test/unit/parse_cmd_test.rb +260 -0
- data/test/unit/permalink_copy_test.rb +211 -0
- data/test/unit/post.rb +309 -0
- data/test/unit/post_index_config_test.rb +258 -0
- data/test/unit/post_state_helpers_test.rb +137 -0
- data/test/unit/read_commented_file_test.rb +278 -0
- data/test/unit/reddit_test.rb +235 -0
- data/test/unit/repo.rb +569 -0
- data/test/unit/social_test.rb +366 -0
- data/test/unit/syntax_highlighting.rb +70 -0
- data/test/unit/theme_management_test.rb +91 -0
- data/test/unit/view.rb +498 -0
- data/test/unit/widgets.rb +669 -0
- data/test/web_integration_test.rb +231 -0
- data/test/web_test_helper.rb +218 -0
- data/test/web_workflow_test.rb +527 -0
- data/test/wizard_test.rb +123 -0
- data/ui/README.md +67 -0
- data/ui/common/lib/ui_common.rb +8 -0
- data/ui/rubytext/README.md +191 -0
- data/ui/rubytext/bin/scriptorium-rubytext +402 -0
- data/ui/rubytext/lib/rubytext_ui.rb +300 -0
- data/ui/tui/bin/scriptorium +1890 -0
- data/ui/tui/test/tui_test.rb +23 -0
- data/ui/web/app/app.rb +2600 -0
- data/ui/web/app/assets/livetext_mode.js +244 -0
- data/ui/web/app/error_helpers.rb +150 -0
- data/ui/web/app/views/advanced_config.erb +196 -0
- data/ui/web/app/views/asset_management.erb +645 -0
- data/ui/web/app/views/backup_management.erb +238 -0
- data/ui/web/app/views/banner_config.erb +200 -0
- data/ui/web/app/views/config_widget.erb +232 -0
- data/ui/web/app/views/configure_view.erb +401 -0
- data/ui/web/app/views/dashboard.erb +154 -0
- data/ui/web/app/views/deploy_config.erb +149 -0
- data/ui/web/app/views/edit_pages.erb +363 -0
- data/ui/web/app/views/edit_post.erb +175 -0
- data/ui/web/app/views/edit_theme.erb +73 -0
- data/ui/web/app/views/edit_theme_file.erb +74 -0
- data/ui/web/app/views/error_page.erb +29 -0
- data/ui/web/app/views/header_config.erb +155 -0
- data/ui/web/app/views/layout_config.erb +147 -0
- data/ui/web/app/views/navbar_config.erb +411 -0
- data/ui/web/app/views/theme_management.erb +130 -0
- data/ui/web/app/views/view_dashboard.erb +779 -0
- data/ui/web/app/views/widgets.erb +249 -0
- data/ui/web/bin/scriptorium-web +164 -0
- data/ui/web/test/web_basic_test.rb +38 -0
- data/ui/web/test_navbar.txt +7 -0
- data/ui/web/tmp/timing.log +17 -0
- data/ui/web/tmp/web_server.log +0 -0
- metadata +434 -8
- data/lib/scriptorium/engine.rb +0 -22
- data/test/engine/unit.rb +0 -44
data/test/README.md
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
# Scriptorium Test Suite
|
2
|
+
|
3
|
+
## Quick Start
|
4
|
+
|
5
|
+
### Run All Tests (Unit + Automated Manual Tests)
|
6
|
+
```bash
|
7
|
+
ruby test/run_automated_tests.rb
|
8
|
+
```
|
9
|
+
|
10
|
+
### Run Unit Tests Only
|
11
|
+
```bash
|
12
|
+
ruby test/all
|
13
|
+
```
|
14
|
+
|
15
|
+
### Run Individual Manual Tests
|
16
|
+
```bash
|
17
|
+
# Interactive mode (opens browser)
|
18
|
+
ruby test/manual/test1.rb
|
19
|
+
|
20
|
+
# Automated mode (no browser, just validation)
|
21
|
+
ruby test/manual/test1.rb --automated
|
22
|
+
```
|
23
|
+
|
24
|
+
## Test Types
|
25
|
+
|
26
|
+
### Unit Tests (`test/unit/`)
|
27
|
+
- **Core functionality tests** - Basic helper methods, file operations
|
28
|
+
- **Repo tests** - Repository creation, management, post handling
|
29
|
+
- **Post tests** - Individual post functionality
|
30
|
+
- **View tests** - View generation and management
|
31
|
+
- **Banner SVG tests** - SVG banner generation and validation
|
32
|
+
|
33
|
+
### Manual Tests (`test/manual/`)
|
34
|
+
- **Integration tests** - End-to-end workflows
|
35
|
+
- **Banner feature tests** - Visual verification of SVG banners
|
36
|
+
- **Widget tests** - Sidebar widgets and functionality
|
37
|
+
- **Layout tests** - Page layout and styling
|
38
|
+
|
39
|
+
## Automated Testing
|
40
|
+
|
41
|
+
All manual tests support `--automated` mode for CI/CD:
|
42
|
+
- No browser interaction required
|
43
|
+
- Validates file generation
|
44
|
+
- Returns exit codes for automation
|
45
|
+
- Use `--automated` as the **last** parameter
|
46
|
+
|
47
|
+
## Environment Setup
|
48
|
+
|
49
|
+
The test environment is automatically configured:
|
50
|
+
- PATH is set to include rbenv shims
|
51
|
+
- Test repositories are created in `test/scriptorium-TEST/`
|
52
|
+
- Webrick server starts on port 8000 for manual tests
|
53
|
+
- Cleanup happens automatically
|
54
|
+
|
55
|
+
## Examples
|
56
|
+
|
57
|
+
```bash
|
58
|
+
# Run all tests
|
59
|
+
ruby test/run_automated_tests.rb
|
60
|
+
|
61
|
+
# Run specific manual test interactively
|
62
|
+
ruby test/manual/test_banner_combinations.rb
|
63
|
+
|
64
|
+
# Run specific manual test in automated mode
|
65
|
+
ruby test/manual/test_banner_combinations.rb --automated
|
66
|
+
|
67
|
+
# Run test3 with specific view
|
68
|
+
ruby test/manual/test3.rb blog1 --automated
|
69
|
+
```
|
@@ -0,0 +1,196 @@
|
|
1
|
+
# Web Integration Test Framework
|
2
|
+
|
3
|
+
This directory contains a comprehensive web integration testing framework for the Scriptorium web application, based on the existing TUI integration test patterns.
|
4
|
+
|
5
|
+
## Overview
|
6
|
+
|
7
|
+
The web integration tests verify that the web application works correctly in test mode, including:
|
8
|
+
- Server startup/shutdown in test mode
|
9
|
+
- HTTP endpoint functionality
|
10
|
+
- Form submission and redirects
|
11
|
+
- Test repository isolation
|
12
|
+
- Complete workflow testing
|
13
|
+
|
14
|
+
## Test Files
|
15
|
+
|
16
|
+
### 1. `web_test_helper.rb`
|
17
|
+
**Shared helper module** containing common web testing functionality:
|
18
|
+
- Web server management (start/stop)
|
19
|
+
- HTTP request methods (GET, POST, PUT, DELETE)
|
20
|
+
- Response assertions (success, redirect, not found)
|
21
|
+
- Test environment setup
|
22
|
+
- Repository cleanup
|
23
|
+
|
24
|
+
### 2. `web_integration_test.rb`
|
25
|
+
**Basic integration tests** for core web functionality:
|
26
|
+
- `test_001_basic_web_interaction` - Verifies web app starts and responds
|
27
|
+
- `test_002_view_creation_workflow` - Tests dashboard and repository creation
|
28
|
+
- `test_003_asset_management_web` - Tests asset management access
|
29
|
+
- `test_004_view_configuration_web` - Tests view configuration access
|
30
|
+
- `test_005_deployment_configuration_web` - Tests deployment configuration access
|
31
|
+
|
32
|
+
### 3. `web_workflow_test.rb`
|
33
|
+
**Comprehensive workflow tests** that mirror TUI functionality:
|
34
|
+
- `test_001_complete_repository_setup` - Full repository creation workflow
|
35
|
+
- `test_002_view_creation_workflow` - View creation via web forms
|
36
|
+
- `test_003_post_creation_workflow` - Post creation via web forms
|
37
|
+
- `test_004_asset_management_workflow` - Asset management workflow
|
38
|
+
- `test_005_view_configuration_workflow` - View configuration workflow
|
39
|
+
- `test_006_deployment_workflow` - Deployment configuration workflow
|
40
|
+
- `test_007_error_handling` - Error handling and edge cases
|
41
|
+
|
42
|
+
## Key Features
|
43
|
+
|
44
|
+
### Test Mode Support
|
45
|
+
- All tests run with `--test` flag
|
46
|
+
- Uses `ui/web/scriptorium-TEST` repository
|
47
|
+
- Completely isolated from production data
|
48
|
+
- Verifies test mode is active
|
49
|
+
|
50
|
+
### HTTP Testing
|
51
|
+
- Tests actual HTTP requests/responses
|
52
|
+
- Handles redirects (302/303) properly
|
53
|
+
- Tests form submissions and validations
|
54
|
+
- Verifies response codes and content
|
55
|
+
|
56
|
+
### Workflow Testing
|
57
|
+
- Tests complete user workflows
|
58
|
+
- Sets up test environment (repo + view) as needed
|
59
|
+
- Verifies state changes after operations
|
60
|
+
- Tests error conditions and edge cases
|
61
|
+
|
62
|
+
### Server Management
|
63
|
+
- Automatic web server startup/shutdown
|
64
|
+
- Waits for server to be ready
|
65
|
+
- Cleans up test repositories
|
66
|
+
- Handles server process management
|
67
|
+
|
68
|
+
## Usage
|
69
|
+
|
70
|
+
### Running Individual Tests
|
71
|
+
```bash
|
72
|
+
# Run basic integration tests
|
73
|
+
ruby test/web_integration_test.rb
|
74
|
+
|
75
|
+
# Run workflow tests
|
76
|
+
ruby test/web_workflow_test.rb
|
77
|
+
|
78
|
+
# Run specific test
|
79
|
+
ruby test/web_integration_test.rb -n test_001_basic_web_interaction
|
80
|
+
```
|
81
|
+
|
82
|
+
### Running All Web Tests
|
83
|
+
```bash
|
84
|
+
# Run all web-related tests
|
85
|
+
ruby test/web_integration_test.rb
|
86
|
+
ruby test/web_workflow_test.rb
|
87
|
+
```
|
88
|
+
|
89
|
+
## Test Patterns
|
90
|
+
|
91
|
+
### Setup/Teardown
|
92
|
+
```ruby
|
93
|
+
def setup
|
94
|
+
cleanup_test_repo
|
95
|
+
ENV['DBC_DISABLED'] = 'true'
|
96
|
+
# rbenv hack for correct Ruby version
|
97
|
+
end
|
98
|
+
|
99
|
+
def teardown
|
100
|
+
cleanup_test_repo
|
101
|
+
stop_web_server
|
102
|
+
end
|
103
|
+
```
|
104
|
+
|
105
|
+
### HTTP Requests
|
106
|
+
```ruby
|
107
|
+
# GET request
|
108
|
+
response = get("/status")
|
109
|
+
|
110
|
+
# POST request with form data
|
111
|
+
response = post("/create_view", {
|
112
|
+
name: "test-view",
|
113
|
+
title: "Test View"
|
114
|
+
})
|
115
|
+
```
|
116
|
+
|
117
|
+
### Assertions
|
118
|
+
```ruby
|
119
|
+
# Success response
|
120
|
+
assert_response_success(response, "Should succeed")
|
121
|
+
|
122
|
+
# Redirect response
|
123
|
+
assert_response_redirect(response, "Should redirect")
|
124
|
+
|
125
|
+
# Content verification
|
126
|
+
assert_includes response.body, "Expected text"
|
127
|
+
```
|
128
|
+
|
129
|
+
### Test Environment Setup
|
130
|
+
```ruby
|
131
|
+
# Setup basic test environment (repo + view)
|
132
|
+
setup_test_environment
|
133
|
+
|
134
|
+
# Or manually
|
135
|
+
post("/create_repo", {})
|
136
|
+
post("/create_view", { name: "test-view", title: "Test" })
|
137
|
+
```
|
138
|
+
|
139
|
+
## Architecture
|
140
|
+
|
141
|
+
### Helper Module Design
|
142
|
+
- **WebTestHelper** - Shared functionality across all web tests
|
143
|
+
- **HTTP Methods** - GET, POST, PUT, DELETE with error handling
|
144
|
+
- **Assertions** - Response code and content verification
|
145
|
+
- **Server Management** - Start, stop, wait, cleanup
|
146
|
+
|
147
|
+
### Test Class Structure
|
148
|
+
- **Include Helpers** - `Scriptorium::Helpers` and `WebTestHelper`
|
149
|
+
- **Setup/Teardown** - Repository cleanup and server management
|
150
|
+
- **Test Methods** - Individual workflow tests
|
151
|
+
- **Private Methods** - Test-specific helper methods
|
152
|
+
|
153
|
+
### Test Isolation
|
154
|
+
- Each test starts with clean state
|
155
|
+
- Test repository is created/destroyed per test
|
156
|
+
- Web server is started/stopped per test
|
157
|
+
- No cross-test contamination
|
158
|
+
|
159
|
+
## Comparison with TUI Tests
|
160
|
+
|
161
|
+
| Aspect | TUI Tests | Web Tests |
|
162
|
+
|--------|-----------|-----------|
|
163
|
+
| **Interface** | PTY/terminal | HTTP endpoints |
|
164
|
+
| **Input** | `send_and_expect` | HTTP requests |
|
165
|
+
| **Output** | Terminal output | HTTP responses |
|
166
|
+
| **Setup** | Create test repo | Create test repo + start web server |
|
167
|
+
| **Isolation** | `--test` flag | `--test` flag |
|
168
|
+
| **Speed** | Fast | Medium (HTTP overhead) |
|
169
|
+
| **Realism** | Terminal interaction | Web browser interaction |
|
170
|
+
|
171
|
+
## Benefits
|
172
|
+
|
173
|
+
1. **Real HTTP Testing** - Tests actual web requests/responses
|
174
|
+
2. **End-to-End Validation** - Tests complete web stack
|
175
|
+
3. **Browser-Like Behavior** - Simulates real user interactions
|
176
|
+
4. **Test Mode Verification** - Ensures test isolation works
|
177
|
+
5. **Workflow Coverage** - Tests complete user journeys
|
178
|
+
6. **Error Handling** - Verifies proper error responses
|
179
|
+
7. **Integration Testing** - Tests web app + API working together
|
180
|
+
|
181
|
+
## Future Enhancements
|
182
|
+
|
183
|
+
- **File Upload Testing** - Test asset upload functionality
|
184
|
+
- **Session Management** - Test user sessions and authentication
|
185
|
+
- **AJAX Testing** - Test dynamic content loading
|
186
|
+
- **Performance Testing** - Response time and load testing
|
187
|
+
- **Browser Testing** - Integration with headless browsers
|
188
|
+
- **API Testing** - Direct API endpoint testing
|
189
|
+
|
190
|
+
## Dependencies
|
191
|
+
|
192
|
+
- **Minitest** - Testing framework
|
193
|
+
- **Net::HTTP** - HTTP client for testing
|
194
|
+
- **JSON** - Response parsing
|
195
|
+
- **FileUtils** - File system operations
|
196
|
+
- **Scriptorium::Helpers** - Project helper functions
|
data/test/all
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Set up environment
|
4
|
+
ENV['PATH'] = "#{ENV['HOME']}/.rbenv/shims:#{ENV['PATH']}"
|
5
|
+
|
6
|
+
def delete(path)
|
7
|
+
if Dir.exist?(path)
|
8
|
+
puts "Deleting: #{path}"
|
9
|
+
system("rm -rf #{path}")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
t0 = Time.now
|
14
|
+
puts "Starting at: #{t0}"
|
15
|
+
t1 = t0 + 500
|
16
|
+
puts "Finish ETA : #{t1}"
|
17
|
+
|
18
|
+
puts
|
19
|
+
puts "Killing server..."
|
20
|
+
|
21
|
+
system("lsof -ti:4567 | xargs kill -9")
|
22
|
+
|
23
|
+
puts
|
24
|
+
|
25
|
+
test_repos = %w[scriptorium-TEST test/scriptorium-TEST ui/web/scriptorium-TEST]
|
26
|
+
|
27
|
+
test_repos.each {|repo| delete(repo) }
|
28
|
+
|
29
|
+
require 'minitest/autorun'
|
30
|
+
|
31
|
+
puts "\n" + "="*60
|
32
|
+
puts "Running all Scriptorium tests..."
|
33
|
+
puts "="*60
|
34
|
+
|
35
|
+
# Initialize global to track which test files have printed their name
|
36
|
+
$printed_files = []
|
37
|
+
|
38
|
+
# Automatically find and load all test files
|
39
|
+
test_files = %w[
|
40
|
+
unit/api.rb
|
41
|
+
unit/post.rb
|
42
|
+
unit/repo.rb
|
43
|
+
unit/view.rb
|
44
|
+
unit/widgets.rb
|
45
|
+
unit/read_commented_file_test.rb
|
46
|
+
unit/asset_management.rb
|
47
|
+
unit/gem_asset_management.rb
|
48
|
+
unit/reddit_test.rb
|
49
|
+
unit/clipboard_test.rb
|
50
|
+
unit/deploy_test.rb
|
51
|
+
unit/deploy_config_test.rb
|
52
|
+
unit/permalink_copy_test.rb
|
53
|
+
unit/post_state_helpers_test.rb
|
54
|
+
unit/edit_post_test.rb
|
55
|
+
unit/contract_test.rb
|
56
|
+
unit/social_test.rb
|
57
|
+
unit/livetext_compatibility.rb
|
58
|
+
unit/livetext_basic.rb
|
59
|
+
unit/syntax_highlighting.rb
|
60
|
+
banner_svg/simple_helpers.rb
|
61
|
+
banner_svg/unit.rb
|
62
|
+
integration/integration_test.rb
|
63
|
+
integration/preview_flow_test.rb
|
64
|
+
livetext_plugin_test.rb
|
65
|
+
unit/core.rb
|
66
|
+
unit/post_index_config_test.rb
|
67
|
+
unit/parse_cmd_test.rb
|
68
|
+
unit/backup_test.rb
|
69
|
+
unit/theme_management_test.rb
|
70
|
+
ed_test.rb
|
71
|
+
tui_integration_test.rb
|
72
|
+
tui_editor_integration_test.rb
|
73
|
+
web_integration_test.rb
|
74
|
+
web_workflow_test.rb
|
75
|
+
]
|
76
|
+
|
77
|
+
|
78
|
+
# Load all test files
|
79
|
+
test_files.each do |file|
|
80
|
+
require_relative file
|
81
|
+
rescue => e
|
82
|
+
puts "Error loading #{file}: #{e.message}"
|
83
|
+
end
|
data/test/api_demo.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/scriptorium'
|
4
|
+
|
5
|
+
# Demo of select_posts and search_posts methods
|
6
|
+
puts "=== Scriptorium API Demo: Post Selection and Search ===\n"
|
7
|
+
|
8
|
+
api = Scriptorium::API.new(true)
|
9
|
+
|
10
|
+
# Create some test data
|
11
|
+
api.create_view_and_use("blog", "My Blog")
|
12
|
+
api.create_view("tech", "Tech Posts")
|
13
|
+
|
14
|
+
# Create posts with different content
|
15
|
+
api.create_post("Ruby Programming Guide", "Learn Ruby basics and advanced features", tags: "ruby, programming, tutorial")
|
16
|
+
api.create_post("Python vs Ruby", "Comparing Python and Ruby for web development", tags: "python, ruby, comparison")
|
17
|
+
api.create_post("Scriptorium API Documentation", "Complete guide to the Scriptorium API", tags: "api, documentation, scriptorium")
|
18
|
+
api.create_post("Web Development Tips", "Best practices for modern web development", tags: "web, tips, development")
|
19
|
+
|
20
|
+
puts "Created 4 posts with various content\n"
|
21
|
+
|
22
|
+
# Demo select_posts with block filtering
|
23
|
+
puts "\n=== select_posts Examples ==="
|
24
|
+
|
25
|
+
# Filter posts by title containing "Ruby"
|
26
|
+
ruby_posts = api.select_posts { |post| post.title.include?("Ruby") }
|
27
|
+
puts "Posts with 'Ruby' in title: #{ruby_posts.map(&:title).join(', ')}"
|
28
|
+
|
29
|
+
# Filter posts by tags containing "api"
|
30
|
+
api_posts = api.select_posts { |post| post.tags.include?("api") }
|
31
|
+
puts "Posts tagged with 'api': #{api_posts.map(&:title).join(', ')}"
|
32
|
+
|
33
|
+
# Filter posts by title length
|
34
|
+
long_title_posts = api.select_posts { |post| post.title.length > 20 }
|
35
|
+
puts "Posts with long titles: #{long_title_posts.map(&:title).join(', ')}"
|
36
|
+
|
37
|
+
# Demo search_posts with keyword criteria
|
38
|
+
puts "\n=== search_posts Examples ==="
|
39
|
+
|
40
|
+
# Search by title with regex
|
41
|
+
ruby_title_posts = api.search_posts(title: /Ruby/)
|
42
|
+
puts "Posts with 'Ruby' in title (regex): #{ruby_title_posts.map(&:title).join(', ')}"
|
43
|
+
|
44
|
+
# Search by body content
|
45
|
+
body_posts = api.search_posts(body: "development")
|
46
|
+
puts "Posts with 'development' in body: #{body_posts.map(&:title).join(', ')}"
|
47
|
+
|
48
|
+
# Search by tags
|
49
|
+
tagged_posts = api.search_posts(tags: "programming")
|
50
|
+
puts "Posts tagged with 'programming': #{tagged_posts.map(&:title).join(', ')}"
|
51
|
+
|
52
|
+
# Multiple criteria (AND)
|
53
|
+
multi_posts = api.search_posts(title: /Ruby/, body: "basics")
|
54
|
+
puts "Posts with 'Ruby' in title AND 'basics' in body: #{multi_posts.map(&:title).join(', ')}"
|
55
|
+
|
56
|
+
# Demo with blurb (create a post with blurb)
|
57
|
+
puts "\n=== search_posts with Blurb ==="
|
58
|
+
api.create_post("Ruby Deep Dive", "Advanced Ruby concepts", blurb: "This is a comprehensive guide to Ruby programming.")
|
59
|
+
|
60
|
+
blurb_posts = api.search_posts(blurb: "comprehensive")
|
61
|
+
puts "Posts with 'comprehensive' in blurb: #{blurb_posts.map(&:title).join(', ')}"
|
62
|
+
|
63
|
+
# Demo draft management
|
64
|
+
puts "\n=== Draft Management ==="
|
65
|
+
draft_path = api.draft(title: "Temporary Draft", body: "This will be deleted")
|
66
|
+
puts "Created draft: #{draft_path}"
|
67
|
+
|
68
|
+
drafts = api.drafts
|
69
|
+
puts "Drafts before deletion: #{drafts.length}"
|
70
|
+
|
71
|
+
api.delete_draft(draft_path)
|
72
|
+
drafts = api.drafts
|
73
|
+
puts "Drafts after deletion: #{drafts.length}"
|
74
|
+
|
75
|
+
# Demo generate_view
|
76
|
+
puts "\n=== Generate View ==="
|
77
|
+
result = api.generate_view
|
78
|
+
puts "Generated view content: #{result}"
|
79
|
+
|
80
|
+
# Demo widget generation
|
81
|
+
puts "\n=== Widget Generation ==="
|
82
|
+
|
83
|
+
# Create widget directory and sample data in the current view
|
84
|
+
widget_dir = api.repo.root/:views/api.current_view.name/:widgets/"links"
|
85
|
+
FileUtils.mkdir_p(widget_dir)
|
86
|
+
File.write(widget_dir/"list.txt", "https://ruby-lang.org, Ruby Language\nhttps://github.com, GitHub")
|
87
|
+
|
88
|
+
result = api.generate_widget("links")
|
89
|
+
puts "Generated links widget: #{result}"
|
90
|
+
|
91
|
+
# Check if widget files were created
|
92
|
+
if File.exist?(widget_dir/"links-card.html")
|
93
|
+
puts "Widget card file created successfully"
|
94
|
+
else
|
95
|
+
puts "Widget card file not found"
|
96
|
+
end
|
97
|
+
|
98
|
+
puts "\n=== Demo Complete ==="
|
99
|
+
api.destroy
|
Binary file
|
Binary file
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Test Images for BannerSVG
|
2
|
+
|
3
|
+
This directory contains test images for verifying image background functionality in BannerSVG.
|
4
|
+
|
5
|
+
## Expected Images
|
6
|
+
|
7
|
+
| Filename | Size | Aspect | Purpose |
|
8
|
+
|----------|------|--------|---------|
|
9
|
+
| `perfect.png` | 800x100 | 8:1 | Ideal case - matches default banner aspect |
|
10
|
+
| `wide.png` | 800x50 | 16:1 | Tests left/right cropping |
|
11
|
+
| `tall.png` | 100x100 | 1:1 | Tests top/bottom cropping |
|
12
|
+
| `very_tall.png` | 100x400 | 1:4 | Tests extreme vertical cropping |
|
13
|
+
| `very_wide.png` | 1600x100 | 16:1 | Tests extreme horizontal cropping |
|
14
|
+
| `small.png` | 200x25 | 8:1 | Tests scaling up of small images |
|
15
|
+
| `odd_aspect.png` | 500x123 | ~4:1 | Tests non-integer aspect ratios |
|
16
|
+
|
17
|
+
## Expected Behavior
|
18
|
+
|
19
|
+
- **Perfect match**: Image should display without cropping
|
20
|
+
- **Wide images**: Should crop left/right, center the image
|
21
|
+
- **Tall images**: Should crop top/bottom, center the image
|
22
|
+
- **Small images**: Should scale up to fill the banner
|
23
|
+
- **All images**: Should use `preserveAspectRatio="xMidYMid slice"` for cropping
|
24
|
+
|
25
|
+
## Manual Testing
|
26
|
+
|
27
|
+
Run `ruby test/manual/test_banner_features.rb` to see these images in action with different banner configurations.
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module SimpleTestHelpers
|
2
|
+
def assert_present(str, *targets)
|
3
|
+
result = true
|
4
|
+
missing = []
|
5
|
+
targets.each do |t|
|
6
|
+
if ! str.include?(t)
|
7
|
+
result = false
|
8
|
+
missing << t
|
9
|
+
end
|
10
|
+
end
|
11
|
+
assert result, "Targets missing: #{missing.join(", ").inspect}"
|
12
|
+
end
|
13
|
+
end
|