spontaneous 0.2.0.alpha2 → 0.2.0.alpha3
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.
- data/Gemfile +3 -40
- data/Rakefile +29 -41
- data/Readme.markdown +21 -8
- data/application/css/add_alias_dialogue.css.scss +79 -0
- data/application/css/{v2.scss → core.css.scss} +537 -550
- data/application/css/{definitions.scss → definitions.css.scss} +121 -33
- data/application/css/dialogue.css.scss +409 -0
- data/application/css/{editing.scss → editing.css.scss} +25 -262
- data/application/css/font.css.scss +8 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_222222_256x240.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_228ef1_256x240.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ef8c08_256x240.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffd27a_256x240.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffffff_256x240.png +0 -0
- data/application/css/jquery-ui-1.8.21.custom/ui-lightness.css.scss +565 -0
- data/application/css/{login.scss → login.css.scss} +4 -4
- data/application/css/meta.css.scss +331 -0
- data/application/css/{popover.scss → popover.css.scss} +9 -8
- data/application/css/{schema_error.scss → schema_error.css.scss} +4 -4
- data/application/css/spontaneous.css +5 -0
- data/application/css/unsupported.css.scss +42 -0
- data/application/js/add_alias_dialogue.js +72 -10
- data/application/js/ajax.js +50 -16
- data/application/js/compatibility.js +19 -15
- data/application/js/content.js +39 -36
- data/application/js/content_area.js +53 -5
- data/application/js/dialogue.js +17 -0
- data/application/js/dom.js +1 -1
- data/application/js/edit_panel.js +23 -8
- data/application/js/extensions.js +7 -2
- data/application/js/field_preview.js +2 -1
- data/application/js/field_types/date_field.js +11 -8
- data/application/js/field_types/file_field.js +188 -9
- data/application/js/field_types/image_field.js +46 -29
- data/application/js/field_types/markdown_field.js +57 -14
- data/application/js/field_types/select_field.js +72 -0
- data/application/js/field_types/string_field.js +8 -0
- data/application/js/field_types/webvideo_field.js +8 -0
- data/application/js/init.js +1 -7
- data/application/js/location.js +41 -13
- data/application/js/login.js +3 -0
- data/application/js/meta_view/user_admin.js +543 -0
- data/application/js/meta_view.js +1 -0
- data/application/js/metadata.js +20 -0
- data/application/js/page.js +17 -3
- data/application/js/page_browser.js +40 -30
- data/application/js/page_entry.js +4 -0
- data/application/js/panel/root_menu.js +66 -0
- data/application/js/popover.js +2 -2
- data/application/js/preview.js +1 -1
- data/application/js/publish.js +138 -30
- data/application/js/services.js +43 -0
- data/application/js/sharded_upload.js +2 -2
- data/application/js/spontaneous.js +64 -5
- data/application/js/state.js +20 -9
- data/application/js/top_bar.js +273 -150
- data/application/js/types.js +20 -15
- data/application/js/upload.js +1 -2
- data/application/js/user.js +18 -4
- data/application/js/vendor/date.js +104 -0
- data/application/js/vendor/jquery-ui-1.8.18.custom.min.js +356 -0
- data/application/js/views/box_view.js +15 -8
- data/application/js/views/page_piece_view.js +11 -8
- data/application/js/views/page_view.js +21 -3
- data/application/js/views/piece_view.js +19 -10
- data/application/js/views.js +3 -0
- data/application/static/chromelogo-200x52-45c7cbc93be080bea342df5fcda2ef8b.png +0 -0
- data/application/static/dot-texture-9eea29e4ac7ad9a772285252078ec127.png +0 -0
- data/application/static/editing-textarea-resize-s-b5af62365eb7e19ea4beccf7242d508e.png +0 -0
- data/application/static/editing-texture-1-42b06a3439752490988f30f2a06d5e7c.png +0 -0
- data/application/static/font/fontawesome-webfont-5c5c21100a346972a82c34c5e96ffcfe.ttf +0 -0
- data/application/static/loop_alt1-white-7894b458528e92216196cae26b4c2c96.svg +12 -0
- data/application/static/spontaneous-states-e91ec89db525c62da0105b97cdd781ce.png +0 -0
- data/application/views/index.erb +2 -2
- data/application/views/login.erb +4 -8
- data/application/views/schema_modification_error.html.erb +1 -4
- data/application/views/unsupported.erb +9 -7
- data/bin/spot +1 -1
- data/db/migrations/20110209152710_users_and_groups.rb +10 -10
- data/db/migrations/20120305112647_site_modification_time.rb +11 -0
- data/db/migrations/20120418153903_add_ownership_of_content.rb +14 -0
- data/db/migrations/20120423175416_add_pending_modifications.rb +21 -0
- data/db/migrations/20120525164947_add_field_versions.rb +27 -0
- data/lib/sequel/plugins/scoped_table_name.rb +10 -1
- data/lib/spontaneous/asset/file.rb +25 -0
- data/lib/spontaneous/asset/source.rb +28 -0
- data/lib/spontaneous/asset.rb +75 -0
- data/lib/spontaneous/box.rb +6 -4
- data/lib/spontaneous/capistrano/deploy.rb +47 -0
- data/lib/spontaneous/capistrano/sync.rb +81 -0
- data/lib/spontaneous/capistrano.rb +13 -0
- data/lib/spontaneous/change.rb +60 -68
- data/lib/spontaneous/cli/assets.rb +29 -0
- data/lib/spontaneous/cli/base.rb +0 -48
- data/lib/spontaneous/cli/console.rb +1 -1
- data/lib/spontaneous/cli/server.rb +6 -4
- data/lib/spontaneous/cli/site.rb +28 -17
- data/lib/spontaneous/cli/user.rb +107 -0
- data/lib/spontaneous/cli.rb +100 -4
- data/lib/spontaneous/collections/entry_set.rb +2 -2
- data/lib/spontaneous/collections/field_set.rb +48 -22
- data/lib/spontaneous/collections/prototype_set.rb +20 -13
- data/lib/spontaneous/constants.rb +3 -0
- data/lib/spontaneous/content.rb +22 -5
- data/lib/spontaneous/errors.rb +3 -3
- data/lib/spontaneous/extensions/array.rb +12 -0
- data/lib/spontaneous/extensions/enumerable.rb +30 -0
- data/lib/spontaneous/extensions/nil.rb +3 -1
- data/lib/spontaneous/extensions/string.rb +16 -0
- data/lib/spontaneous/field_types/date_field.rb +45 -2
- data/lib/spontaneous/field_types/field.rb +42 -9
- data/lib/spontaneous/field_types/file_field.rb +68 -0
- data/lib/spontaneous/field_types/image_field.rb +63 -0
- data/lib/spontaneous/field_types/select_field.rb +109 -0
- data/lib/spontaneous/field_types/string_field.rb +6 -1
- data/lib/spontaneous/field_types/webvideo_field.rb +85 -27
- data/lib/spontaneous/field_types.rb +1 -1
- data/lib/spontaneous/field_version.rb +8 -0
- data/lib/spontaneous/generators/page.rb +1 -1
- data/lib/spontaneous/generators/site/Capfile.tt +1 -4
- data/lib/spontaneous/generators/site/Gemfile.tt +13 -6
- data/lib/spontaneous/generators/site/config/deploy.rb.tt +28 -0
- data/lib/spontaneous/generators/site/config/environments/production.rb.tt +7 -2
- data/lib/spontaneous/generators/site.rb +1 -0
- data/lib/spontaneous/json.rb +34 -11
- data/lib/spontaneous/layout.rb +22 -0
- data/lib/spontaneous/media/file.rb +4 -0
- data/lib/spontaneous/output/assets/compression.rb +58 -0
- data/lib/spontaneous/output/assets.rb +32 -0
- data/lib/spontaneous/output/context.rb +179 -0
- data/lib/spontaneous/output/format/html.rb +5 -0
- data/lib/spontaneous/output/format/plain.rb +5 -0
- data/lib/spontaneous/output/format.rb +180 -0
- data/lib/spontaneous/output/helpers/classes_helper.rb +18 -0
- data/lib/spontaneous/{render/helpers/html_helper.rb → output/helpers/conditional_comment_helper.rb} +3 -12
- data/lib/spontaneous/output/helpers/script_helper.rb +73 -0
- data/lib/spontaneous/output/helpers/stylesheet_helper.rb +61 -0
- data/lib/spontaneous/output/helpers.rb +28 -0
- data/lib/spontaneous/output/template/engine.rb +59 -0
- data/lib/spontaneous/output/template/renderer.rb +153 -0
- data/lib/spontaneous/output/template.rb +21 -0
- data/lib/spontaneous/output.rb +163 -0
- data/lib/spontaneous/page.rb +2 -1
- data/lib/spontaneous/paths.rb +6 -1
- data/lib/spontaneous/permissions/access_key.rb +5 -5
- data/lib/spontaneous/permissions/user.rb +81 -35
- data/lib/spontaneous/permissions/user_level.rb +26 -22
- data/lib/spontaneous/plugins/aliases.rb +76 -12
- data/lib/spontaneous/plugins/allowed_types.rb +60 -18
- data/lib/spontaneous/plugins/application/paths.rb +0 -28
- data/lib/spontaneous/plugins/application/system.rb +35 -0
- data/lib/spontaneous/plugins/boxes.rb +4 -0
- data/lib/spontaneous/plugins/content_groups.rb +16 -0
- data/lib/spontaneous/plugins/entries.rb +50 -30
- data/lib/spontaneous/plugins/fields.rb +15 -0
- data/lib/spontaneous/plugins/layouts.rb +8 -2
- data/lib/spontaneous/plugins/modifications.rb +228 -0
- data/lib/spontaneous/plugins/page/formats.rb +67 -42
- data/lib/spontaneous/plugins/page/request.rb +10 -0
- data/lib/spontaneous/plugins/page/site_timestamps.rb +28 -0
- data/lib/spontaneous/plugins/paths.rb +15 -3
- data/lib/spontaneous/plugins/publishing.rb +124 -45
- data/lib/spontaneous/plugins/render.rb +13 -8
- data/lib/spontaneous/plugins/schema_hierarchy.rb +18 -6
- data/lib/spontaneous/plugins/site/helpers.rb +53 -0
- data/lib/spontaneous/plugins/site/hooks.rb +50 -0
- data/lib/spontaneous/plugins/site/map.rb +1 -1
- data/lib/spontaneous/plugins/site/paths.rb +13 -0
- data/lib/spontaneous/plugins/site/publishing.rb +6 -2
- data/lib/spontaneous/plugins/site/{revisions.rb → state.rb} +5 -1
- data/lib/spontaneous/plugins/site/storage.rb +4 -0
- data/lib/spontaneous/plugins/site/url.rb +15 -0
- data/lib/spontaneous/plugins/site_map.rb +13 -3
- data/lib/spontaneous/plugins/styles.rb +5 -1
- data/lib/spontaneous/plugins/visibility.rb +39 -12
- data/lib/spontaneous/prototypes/box_prototype.rb +4 -0
- data/lib/spontaneous/prototypes/field_prototype.rb +15 -10
- data/lib/spontaneous/publishing/event_client.rb +46 -0
- data/lib/spontaneous/publishing/immediate.rb +81 -44
- data/lib/spontaneous/publishing/simultaneous.rb +23 -6
- data/lib/spontaneous/publishing.rb +4 -3
- data/lib/spontaneous/rack/around_back.rb +1 -5
- data/lib/spontaneous/rack/around_front.rb +4 -4
- data/lib/spontaneous/rack/around_preview.rb +4 -3
- data/lib/spontaneous/rack/assets.rb +81 -54
- data/lib/spontaneous/rack/authentication.rb +0 -1
- data/lib/spontaneous/rack/back.rb +160 -72
- data/lib/spontaneous/rack/cookie_authentication.rb +2 -2
- data/lib/spontaneous/rack/css.rb +18 -15
- data/lib/spontaneous/rack/event_source.rb +9 -21
- data/lib/spontaneous/rack/fiber_pool.rb +26 -0
- data/lib/spontaneous/rack/front.rb +12 -4
- data/lib/spontaneous/rack/helpers.rb +35 -13
- data/lib/spontaneous/rack/js.rb +41 -0
- data/lib/spontaneous/rack/public.rb +34 -44
- data/lib/spontaneous/rack/sse.rb +18 -0
- data/lib/spontaneous/rack/static.rb +3 -0
- data/lib/spontaneous/rack/user_admin.rb +100 -0
- data/lib/spontaneous/rack/user_helpers.rb +1 -1
- data/lib/spontaneous/rack.rb +6 -2
- data/lib/spontaneous/schema.rb +31 -4
- data/lib/spontaneous/search/index.rb +19 -3
- data/lib/spontaneous/search/results.rb +1 -1
- data/lib/spontaneous/sequel.rb +17 -0
- data/lib/spontaneous/site.rb +11 -4
- data/lib/spontaneous/state.rb +11 -0
- data/lib/spontaneous/storage/cloud.rb +4 -0
- data/lib/spontaneous/storage/local.rb +11 -0
- data/lib/spontaneous/style.rb +2 -2
- data/lib/spontaneous/tasks/database.rake +21 -22
- data/lib/spontaneous/utils/database/mysql_dumper.rb +4 -0
- data/lib/spontaneous/utils/database/postgres_dumper.rb +78 -0
- data/lib/spontaneous/utils/database.rb +6 -3
- data/lib/spontaneous/utils/smart_quotes.rb +499 -0
- data/lib/spontaneous/utils/smush_it.rb +66 -0
- data/lib/spontaneous/utils.rb +3 -1
- data/lib/spontaneous/version.rb +2 -2
- data/lib/spontaneous.rb +25 -29
- data/spontaneous.gemspec +186 -106
- data/test/experimental/test_features.rb +1 -1
- data/test/fixtures/asset_pipeline/application/css/basic.css.scss +4 -0
- data/test/fixtures/asset_pipeline/application/css/complex.css.scss.erb +6 -0
- data/test/fixtures/asset_pipeline/application/css/simple.css +3 -0
- data/test/fixtures/asset_pipeline/application/css/spontaneous.css +7 -0
- data/test/fixtures/asset_pipeline/application/css/subdir/complex.css.scss.erb +6 -0
- data/test/fixtures/asset_pipeline/application/css/subdir/library.css.scss +1 -0
- data/test/fixtures/asset_pipeline/application/css/subdir/simple.css +3 -0
- data/test/fixtures/asset_pipeline/application/js/basic.js.coffee +1 -0
- data/test/fixtures/asset_pipeline/application/js/complex.js.coffee.erb +1 -0
- data/test/fixtures/asset_pipeline/application/js/login.js +1 -0
- data/test/fixtures/asset_pipeline/application/js/require.js +1 -0
- data/test/fixtures/asset_pipeline/application/js/simple.js +1 -0
- data/test/fixtures/asset_pipeline/application/js/spontaneous.js +5 -0
- data/test/fixtures/asset_pipeline/application/js/subdir/complex.js.coffee.erb +1 -0
- data/test/fixtures/asset_pipeline/application/js/subdir/library.js.coffee +1 -0
- data/test/fixtures/asset_pipeline/application/js/subdir/simple.js +1 -0
- data/test/fixtures/asset_pipeline/application/js/vendor/jquery.js +1 -0
- data/test/fixtures/asset_pipeline/application/static/dot-texture.png +0 -0
- data/test/fixtures/asset_pipeline/application/static/subdir/px.gif +0 -0
- data/test/fixtures/assets/public1/css/a.scss +1 -0
- data/test/fixtures/assets/public1/js/a.js +1 -0
- data/test/fixtures/assets/public1/js/m.coffee +1 -0
- data/test/fixtures/assets/public2/css/b.scss +1 -0
- data/test/fixtures/assets/public2/css/c.css +1 -0
- data/test/fixtures/assets/public2/js/b.js +1 -0
- data/test/fixtures/assets/public2/js/c.js +1 -0
- data/test/fixtures/assets/public2/js/n.coffee +1 -0
- data/test/fixtures/back/config/user_levels.yml +3 -0
- data/test/fixtures/back/public/js/coffeescript.coffee +1 -0
- data/test/fixtures/back/templates/layouts/standard.css.cut +1 -0
- data/test/fixtures/back/templates/layouts/standard.js.cut +1 -0
- data/test/fixtures/example_application/config/database.yml +4 -4
- data/test/fixtures/helpers/templates/layouts/standard.html.cut +1 -0
- data/test/fixtures/helpers/templates/layouts/standard.mobile.cut +1 -0
- data/test/fixtures/images/vimlogo.pdf +0 -0
- data/test/fixtures/outputs/templates/layouts/standard.atom.cut +1 -0
- data/test/fixtures/permissions/config/user_levels.yml +6 -3
- data/test/fixtures/serialisation/class_hash.yaml.erb +1 -0
- data/test/fixtures/serialisation/root_hash.yaml.erb +2 -2
- data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
- data/test/fixtures/templates/extended/main.html.cut +5 -5
- data/test/fixtures/templates/extended/parent.html.cut +8 -8
- data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -1
- data/test/fixtures/templates/extended/with_includes.html.cut +6 -6
- data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +6 -7
- data/test/fixtures/templates/layouts/entries.html.cut +4 -4
- data/test/fixtures/templates/layouts/standard.html.cut +1 -0
- data/test/fixtures/templates/layouts/variables.html.cut +1 -1
- data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -1
- data/test/fixtures/templates/publishing/templates/layouts/static.rtf.cut +1 -0
- data/test/fixtures/templates/template_class/complex_template.html.cut +2 -2
- data/test/fixtures/templates/template_class/complex_template.pdf.cut +2 -2
- data/test/fixtures/templates/template_class/default_template_style.html.cut +1 -1
- data/test/fixtures/templates/template_class/images_with_template.html.cut +2 -2
- data/test/fixtures/templates/template_class/slots_template.html.cut +2 -2
- data/test/fixtures/templates/template_class/slots_template.pdf.cut +2 -2
- data/test/fixtures/user_manager/config/user_levels.yml +9 -0
- data/test/functional/test_application.rb +7 -7
- data/test/functional/test_back.rb +352 -97
- data/test/functional/test_front.rb +71 -20
- data/test/functional/test_user_manager.rb +284 -0
- data/test/javascript/env.js +13505 -0
- data/test/javascript/test_markdown.rb +43 -3
- data/test/support/custom_matchers.rb +3 -2
- data/test/test_helper.rb +50 -9
- data/test/test_javascript.rb +13 -13
- data/test/ui_helper.rb +1 -1
- data/test/unit/test_alias.rb +79 -8
- data/test/unit/test_asset_bundler.rb +220 -0
- data/test/unit/test_assets.rb +213 -0
- data/test/unit/test_async.rb +55 -0
- data/test/unit/test_authentication.rb +52 -39
- data/test/unit/test_boxes.rb +20 -15
- data/test/unit/test_changesets.rb +261 -0
- data/test/unit/test_content.rb +73 -33
- data/test/unit/test_content_inheritance.rb +18 -18
- data/test/unit/test_extensions.rb +26 -0
- data/test/unit/test_fields.rb +303 -16
- data/test/unit/test_formats.rb +267 -34
- data/test/unit/test_helpers.rb +79 -2
- data/test/unit/test_images.rb +10 -0
- data/test/unit/test_layouts.rb +21 -13
- data/test/unit/test_modifications.rb +648 -0
- data/test/unit/test_page.rb +6 -2
- data/test/unit/test_permissions.rb +101 -27
- data/test/unit/test_piece.rb +4 -4
- data/test/unit/test_plugins.rb +3 -2
- data/test/unit/test_publishing.rb +332 -0
- data/test/unit/test_render.rb +118 -67
- data/test/unit/test_revisions.rb +546 -0
- data/test/unit/test_schema.rb +83 -1
- data/test/unit/test_search.rb +59 -0
- data/test/unit/test_serialisation.rb +2 -47
- data/test/unit/test_site.rb +217 -108
- data/test/unit/test_storage.rb +26 -0
- data/test/unit/test_structure.rb +2 -2
- data/test/unit/test_styles.rb +90 -75
- data/test/unit/test_table_scoping.rb +21 -17
- data/test/unit/test_templates.rb +75 -69
- data/test/{slow → unit}/test_visibility.rb +78 -22
- metadata +528 -221
- data/application/css/add_alias_dialogue.scss +0 -27
- data/application/css/min/14c2a35812c443001b15d8b12a4780f88c678035.css +0 -1
- data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +0 -1
- data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +0 -1
- data/application/css/spontaneous.scss +0 -111
- data/application/css/unsupported.scss +0 -16
- data/application/css/variables.scss +0 -80
- data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +0 -3
- data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +0 -2
- data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +0 -3
- data/application/js/min/b8abf302a824c35385ff517b34111e1710ff3b37.js +0 -2
- data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +0 -90
- data/application/static/diagonal-texture.png +0 -0
- data/application/static/editing-0-noise.png +0 -0
- data/application/static/editing-1-noise.png +0 -0
- data/application/static/editing-texture-1.png +0 -0
- data/application/static/editing-texture.png +0 -0
- data/application/static/editing-toolbar-shadow-bottom.png +0 -0
- data/application/static/editing-toolbar-shadow-top.png +0 -0
- data/application/static/inner-glow.png +0 -0
- data/application/static/item-buttons-highlight.png +0 -0
- data/application/static/item-buttons.png +0 -0
- data/application/static/paper-texture-dark.png +0 -0
- data/application/static/plus_alt.svg +0 -8
- data/application/static/select-arrow-root.png +0 -0
- data/application/static/slot-up-arrow.png +0 -0
- data/application/static/spontaneous.png +0 -0
- data/lib/cutaneous/context_helper.rb +0 -187
- data/lib/cutaneous/preview_context.rb +0 -32
- data/lib/cutaneous/preview_renderer.rb +0 -10
- data/lib/cutaneous/publish_context.rb +0 -10
- data/lib/cutaneous/publish_renderer.rb +0 -14
- data/lib/cutaneous/publish_template.rb +0 -62
- data/lib/cutaneous/publish_token_parser.rb +0 -8
- data/lib/cutaneous/renderer.rb +0 -124
- data/lib/cutaneous/request_context.rb +0 -9
- data/lib/cutaneous/request_renderer.rb +0 -15
- data/lib/cutaneous/request_template.rb +0 -11
- data/lib/cutaneous/request_token_parser.rb +0 -9
- data/lib/cutaneous/token_parser.rb +0 -125
- data/lib/cutaneous.rb +0 -48
- data/lib/spontaneous/render/context_base.rb +0 -143
- data/lib/spontaneous/render/development_renderer.rb +0 -14
- data/lib/spontaneous/render/engine.rb +0 -19
- data/lib/spontaneous/render/format/html.rb +0 -5
- data/lib/spontaneous/render/format.rb +0 -75
- data/lib/spontaneous/render/helpers/script_helper.rb +0 -17
- data/lib/spontaneous/render/helpers/stylesheet_helper.rb +0 -16
- data/lib/spontaneous/render/helpers.rb +0 -14
- data/lib/spontaneous/render/preview_context.rb +0 -8
- data/lib/spontaneous/render/preview_renderer.rb +0 -24
- data/lib/spontaneous/render/publish_context.rb +0 -22
- data/lib/spontaneous/render/published_renderer.rb +0 -53
- data/lib/spontaneous/render/publishing_renderer.rb +0 -16
- data/lib/spontaneous/render/render_cache.rb +0 -26
- data/lib/spontaneous/render/renderer.rb +0 -50
- data/lib/spontaneous/render/request_context.rb +0 -8
- data/lib/spontaneous/render.rb +0 -214
- data/test/experimental/test_cutaneous.rb +0 -309
- data/test/fixtures/application/css/test.less +0 -5
- data/test/slow/test_publishing.rb +0 -1006
- /data/application/css/{developer.scss → developer.css.scss} +0 -0
- /data/application/js/vendor/{jquery-1.7.1.min.js → jquery.js} +0 -0
- /data/application/static/{location-arrow.png → location-arrow-c1c1d3ca472481c61a0a5f8cb289d743.png} +0 -0
- /data/application/static/{missing.png → missing-911ce6dbd9f4602e0f3fbcd7e78846a2.png} +0 -0
- /data/application/static/{orange-down-arrow.png → orange-down-arrow-395ae1929e8662b2ff0977daf12c35bb.png} +0 -0
- /data/application/static/{page-browser-next.png → page-browser-next-ce781a242c23b980b99b9db7abc20b05.png} +0 -0
- /data/application/static/{plus-box.png → plus-box-dcde74a1e496f68298c9b443caa1c5d5.png} +0 -0
- /data/application/static/{select-arrow.png → select-arrow-6e7dd3745b00e934b0d7a3250c46558b.png} +0 -0
- /data/application/static/{slot-down-arrow.png → slot-down-arrow-59ad5f5ee5b52a7ebd00bca4b3104194.png} +0 -0
- /data/application/static/{splash.png → splash-65b493a714df9b8b3ab170103401b53d.png} +0 -0
- /data/application/static/{spot.png → spot-71fab1d2f065034f5fc15e7bea2ad36c.png} +0 -0
- /data/application/static/{spot.svg → spot-8505041082d8d3bbe8d34c29dddb3b7d.svg} +0 -0
- /data/application/static/{texture.png → texture-03f7627e8264b1d607113ab32c593a58.png} +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../../test_helper', __FILE__)
|
|
4
|
+
require 'ostruct'
|
|
5
|
+
require 'shine'
|
|
6
|
+
|
|
7
|
+
class AssetTest < MiniTest::Spec
|
|
8
|
+
|
|
9
|
+
module LiveSimulation
|
|
10
|
+
# simulate a production + publishing environment
|
|
11
|
+
def live?
|
|
12
|
+
true
|
|
13
|
+
end
|
|
14
|
+
# usually set as part of the render process
|
|
15
|
+
def revision
|
|
16
|
+
99
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def new_context(content = @page, format = :html, params = {})
|
|
21
|
+
renderer = Spontaneous::Output::Template::PublishRenderer.new
|
|
22
|
+
output = content.output(format)
|
|
23
|
+
context = renderer.context(output, params)
|
|
24
|
+
context.extend LiveSimulation
|
|
25
|
+
context
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def setup
|
|
29
|
+
@site = setup_site
|
|
30
|
+
@fixture_root = File.expand_path("../../fixtures/assets", __FILE__)
|
|
31
|
+
@site.paths.add :public, @fixture_root / "public1", @fixture_root / "public2"
|
|
32
|
+
@page = S::Page.create
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def teardown
|
|
36
|
+
S::Content.delete
|
|
37
|
+
teardown_site
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context "Publishing context" do
|
|
41
|
+
should "be flagged as live" do
|
|
42
|
+
Spontaneous.stubs(:production?).returns(true)
|
|
43
|
+
new_context.live?.should be_true
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
should "be flagged as publishing" do
|
|
47
|
+
new_context.publishing?.should be_true
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context "Javascript assets" do
|
|
52
|
+
should "be compressed in live environment" do
|
|
53
|
+
files = [@fixture_root / "public1/js/a.js", @fixture_root / "public2/js/b.js"]
|
|
54
|
+
src = files.map { |p| File.read(p) }.join
|
|
55
|
+
Shine.expects(:compress_string).with(src, :js, {}).once.returns("var A;\nvar B;\n")
|
|
56
|
+
context = new_context
|
|
57
|
+
result = context.scripts("/js/a", "/js/b")
|
|
58
|
+
result.should =~ /src="\/rev\/5dde6b3e04ce364ef23f51048006e5dd7e6f62ad\.js"/
|
|
59
|
+
on_disk = Spontaneous::Output.revision_root(context.revision) / "rev/5dde6b3e04ce364ef23f51048006e5dd7e6f62ad.js"
|
|
60
|
+
assert File.exist?(on_disk)
|
|
61
|
+
File.read(on_disk).should == "var A;\nvar B;\n"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
should "use a cache to make sure identical file lists are only compressed once" do
|
|
65
|
+
files1 = [@fixture_root / "public1/js/a.js", @fixture_root / "public2/js/b.js"]
|
|
66
|
+
files2 = [@fixture_root / "public2/js/b.js", @fixture_root / "public2/js/c.js"]
|
|
67
|
+
src1 = files1.map { |p| File.read(p) }.join
|
|
68
|
+
src2 = files2.map { |p| File.read(p) }.join
|
|
69
|
+
Shine.expects(:compress_string).with(src1, :js, {}).once.returns("var A;\nvar B;\n")
|
|
70
|
+
Shine.expects(:compress_string).with(src2, :js, {}).once.returns("var B;\nvar C;\n")
|
|
71
|
+
context = new_context
|
|
72
|
+
result = context.scripts("/js/a", "/js/b")
|
|
73
|
+
result = context.scripts("/js/a", "/js/b")
|
|
74
|
+
result = context.scripts("/js/b", "/js/c")
|
|
75
|
+
result = context.scripts("/js/b", "/js/c")
|
|
76
|
+
result.should =~ /src="\/rev\/1458221916fde33ec803fbbae20af8ded0ee2ca1\.js"/
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
should "be compressed when publishing & passed a force_compression option" do
|
|
80
|
+
files = [@fixture_root / "public1/js/a.js", @fixture_root / "public2/js/b.js"]
|
|
81
|
+
src = files.map { |p| File.read(p) }.join
|
|
82
|
+
Shine.expects(:compress_string).with(src, :js, {}).once.returns("var A;\nvar B;\n")
|
|
83
|
+
context = new_context
|
|
84
|
+
context.stubs(:live?).returns(false)
|
|
85
|
+
context.stubs(:publishing?).returns(true)
|
|
86
|
+
result = context.scripts("/js/a", "/js/b", :force_compression => true)
|
|
87
|
+
|
|
88
|
+
Shine.expects(:compress_string).with(src, :js, {}).never
|
|
89
|
+
context.stubs(:publishing?).returns(false)
|
|
90
|
+
result = context.scripts("/js/a", "/js/b", :force_compression => true)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
should "support UTF8 scripts" do
|
|
94
|
+
files = [@fixture_root / "public1/js/a.js", @fixture_root / "public2/js/b.js"]
|
|
95
|
+
src = files.map { |p| File.read(p) }.join
|
|
96
|
+
Shine.expects(:compress_string).with(src, :js, {}).once.returns("var A = \"\xC2\";\nvar B;\n".force_encoding("ASCII-8BIT"))
|
|
97
|
+
context = new_context
|
|
98
|
+
result = context.scripts("/js/a", "/js/b")
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
should "support scripts with full urls" do
|
|
102
|
+
context = new_context
|
|
103
|
+
result = context.scripts("http://jquery.com/jquery.js")
|
|
104
|
+
result.should =~ /src="http:\/\/jquery.com\/jquery.js"/
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
context "CoffeeScript assets" do
|
|
109
|
+
should "be compiled & compressed in live environment" do
|
|
110
|
+
files = [@fixture_root / "public1/js/m.js", @fixture_root / "public2/js/n.js"]
|
|
111
|
+
Shine.expects(:compress_string).with((<<-COMPILED), :js, {}).once.returns("var A;\nvar B;\n")
|
|
112
|
+
(function() {
|
|
113
|
+
var square;
|
|
114
|
+
|
|
115
|
+
square = function(x) {
|
|
116
|
+
return x * x;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
if (typeof elvis !== "undefined" && elvis !== null) alert("I knew it!");
|
|
120
|
+
|
|
121
|
+
}).call(this);
|
|
122
|
+
COMPILED
|
|
123
|
+
context = new_context
|
|
124
|
+
result = context.scripts("/js/m", "/js/n")
|
|
125
|
+
result.should =~ /src="\/rev\/5dde6b3e04ce364ef23f51048006e5dd7e6f62ad\.js"/
|
|
126
|
+
on_disk = Spontaneous::Output.revision_root(context.revision) / "rev/5dde6b3e04ce364ef23f51048006e5dd7e6f62ad.js"
|
|
127
|
+
assert File.exist?(on_disk)
|
|
128
|
+
File.read(on_disk).should == "var A;\nvar B;\n"
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
should "be correctly compiled when mixed with plain js" do
|
|
132
|
+
Shine.expects(:compress_string).with((<<-COMPILED), :js, {}).once.returns("var A;\nvar B;\n")
|
|
133
|
+
var A;
|
|
134
|
+
(function() {
|
|
135
|
+
var square;
|
|
136
|
+
|
|
137
|
+
square = function(x) {
|
|
138
|
+
return x * x;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
if (typeof elvis !== "undefined" && elvis !== null) alert("I knew it!");
|
|
142
|
+
|
|
143
|
+
}).call(this);
|
|
144
|
+
var B;
|
|
145
|
+
COMPILED
|
|
146
|
+
context = new_context
|
|
147
|
+
result = context.scripts("/js/a", "/js/m", "/js/n", "/js/b")
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
context "Stylesheet assets" do
|
|
152
|
+
should "be compressed in live environment" do
|
|
153
|
+
files = [@fixture_root / "public1/css/a.scss", @fixture_root / "public2/css/b.scss"]
|
|
154
|
+
context = new_context
|
|
155
|
+
Shine.expects(:compress_string).with(<<-CSS, :css, {}).once.returns("/* compressed */\n")
|
|
156
|
+
.a{width:8px}
|
|
157
|
+
.c { color: #fff; }
|
|
158
|
+
.b{height:42px}
|
|
159
|
+
CSS
|
|
160
|
+
result = context.stylesheets("/css/a", "/css/c", "/css/b")
|
|
161
|
+
result.should =~ /href="\/rev\/df3e2b3fa3409d8ca37faac7da80349098f0b28a\.css"/
|
|
162
|
+
on_disk = Spontaneous::Output.revision_root(context.revision) / "rev/df3e2b3fa3409d8ca37faac7da80349098f0b28a.css"
|
|
163
|
+
|
|
164
|
+
assert File.exist?(on_disk)
|
|
165
|
+
File.read(on_disk).should == "/* compressed */\n"
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
should "be compressed if publishing and passed a force option" do
|
|
169
|
+
files = [@fixture_root / "public1/css/a.scss", @fixture_root / "public2/css/b.scss"]
|
|
170
|
+
context = new_context
|
|
171
|
+
m = Module.new do
|
|
172
|
+
def live?; false; end
|
|
173
|
+
def publishing?; true; end
|
|
174
|
+
end
|
|
175
|
+
context.extend m
|
|
176
|
+
context.live?.should be_false
|
|
177
|
+
Shine.expects(:compress_string).with(anything, :css, {}).once.returns("/* compressed */\n")
|
|
178
|
+
result = context.stylesheets("/css/a", "/css/c", "/css/b", {:force_compression => true})
|
|
179
|
+
|
|
180
|
+
def context.publishing?; false; end
|
|
181
|
+
context.publishing?.should be_false
|
|
182
|
+
Shine.expects(:compress_string).with(anything, :css, {}).never
|
|
183
|
+
result = context.stylesheets("/css/a", "/css/c", "/css/b", {:force_compression => true})
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
should "use a cache to make sure identical file lists are only compressed once" do
|
|
187
|
+
context = new_context
|
|
188
|
+
Shine.expects(:compress_string).with(<<-CSS, :css, {}).once.returns("/* compressed1 */\n")
|
|
189
|
+
.a{width:8px}
|
|
190
|
+
.b{height:42px}
|
|
191
|
+
CSS
|
|
192
|
+
Shine.expects(:compress_string).with(<<-CSS, :css, {}).once.returns("/* compressed2 */\n")
|
|
193
|
+
.a{width:8px}
|
|
194
|
+
.c { color: #fff; }
|
|
195
|
+
CSS
|
|
196
|
+
result = context.stylesheets("/css/a", "/css/b")
|
|
197
|
+
result = context.stylesheets("/css/a", "/css/b")
|
|
198
|
+
result.should =~ /href="\/rev\/20aac22ae20e78ef1574a3a6635fa353148e9d9a\.css"/
|
|
199
|
+
result = context.stylesheets("/css/a", "/css/c")
|
|
200
|
+
result = context.stylesheets("/css/a", "/css/c")
|
|
201
|
+
result.should =~ /href="\/rev\/77ec1b6ee2907c65cf316b99b59c8cf8006dcddf\.css"/
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
should "support UTF8 styles" do
|
|
205
|
+
context = new_context
|
|
206
|
+
Shine.expects(:compress_string).with(<<-CSS, :css, {}).once.returns("/* \xC2 */\n".force_encoding("ASCII-8BIT"))
|
|
207
|
+
.a{width:8px}
|
|
208
|
+
.b{height:42px}
|
|
209
|
+
CSS
|
|
210
|
+
result = context.stylesheets("/css/a", "/css/b")
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../../test_helper', __FILE__)
|
|
4
|
+
require 'eventmachine'
|
|
5
|
+
|
|
6
|
+
class AsyncTest < MiniTest::Spec
|
|
7
|
+
|
|
8
|
+
def setup
|
|
9
|
+
@site = setup_site
|
|
10
|
+
@filename = Time.now.to_i
|
|
11
|
+
@filepath = @site.root / @filename
|
|
12
|
+
File.exist?(@filepath).should be_false
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def teardown
|
|
16
|
+
teardown_site
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context "async system calls" do
|
|
20
|
+
should "be able to test for running EM reactor" do
|
|
21
|
+
Spontaneous.async?.should be_false
|
|
22
|
+
EM.run do
|
|
23
|
+
Spontaneous.async?.should be_true
|
|
24
|
+
EM.stop
|
|
25
|
+
end
|
|
26
|
+
Spontaneous.async?.should be_false
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
should "use fibers to simulate sync code if running in a fiber" do
|
|
30
|
+
EM.run do
|
|
31
|
+
Fiber.new {
|
|
32
|
+
result = Spontaneous.system("touch #{@filepath}")
|
|
33
|
+
File.exist?(@filepath).should be_true
|
|
34
|
+
}.resume
|
|
35
|
+
EM.stop
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# TODO: can't get this to work at moment'
|
|
40
|
+
# should "resort to sync code if execution is not running in a fiber" do
|
|
41
|
+
# EM.run do
|
|
42
|
+
# result = Spontaneous.system("touch #{@filepath}")
|
|
43
|
+
# File.exist?(@filepath).should be_true
|
|
44
|
+
# EM.stop
|
|
45
|
+
# end
|
|
46
|
+
# end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
should "run synchronously outside of EM reactor" do
|
|
50
|
+
result = Spontaneous.system("touch #{@filepath}")
|
|
51
|
+
File.exist?(@filepath).should be_true
|
|
52
|
+
result.should be_true
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -14,8 +14,7 @@ class AuthenticationTest < MiniTest::Spec
|
|
|
14
14
|
:name => "#{name.capitalize}",
|
|
15
15
|
:email => "#{name}@example.org",
|
|
16
16
|
:login => name,
|
|
17
|
-
:password => "#{name}_password"
|
|
18
|
-
:password_confirmation => "#{name}_password"
|
|
17
|
+
:password => "#{name}_password"
|
|
19
18
|
})
|
|
20
19
|
user.update(:level => level)
|
|
21
20
|
user
|
|
@@ -92,20 +91,13 @@ class AuthenticationTest < MiniTest::Spec
|
|
|
92
91
|
def teardown
|
|
93
92
|
teardown_site
|
|
94
93
|
end
|
|
95
|
-
def assert_login_page(path = nil, method = "GET")
|
|
96
|
-
assert last_response.status == 401, "#{method} #{path} should have status 401 but has #{last_response.status}"
|
|
97
|
-
last_response.body.should =~ %r{<form.+action="/@spontaneous/login"}
|
|
98
|
-
last_response.body.should =~ %r{<form.+method="post"}
|
|
99
|
-
last_response.body.should =~ %r{<input.+name="user\[login\]"}
|
|
100
|
-
last_response.body.should =~ %r{<input.+name="user\[password\]"}
|
|
101
|
-
end
|
|
102
94
|
|
|
103
95
|
def post_paths
|
|
104
96
|
%(/save/#{root.id} /savebox/#{root.id}/#{root.boxes[:editor_level].schema_id} /content/#{root.id}/position/0 /file/upload/#{root.id} /file/replace/#{root.id} /file/wrap/#{root.id}/#{root.boxes[:pages].schema_id} /add/#{root.id}/#{root.boxes[:pages].schema_id}/#{SitePage.schema_id} /destroy/#{root.id} /slug/#{root.id} /slug/#{root.id}/unavailable /toggle/#{root.id} /schema/delete /schema/rename)
|
|
105
97
|
end
|
|
106
98
|
|
|
107
99
|
def get_paths
|
|
108
|
-
%(/root /page/#{root.id} /
|
|
100
|
+
%(/root /page/#{root.id} /metadata /map /map/#{root.id} /location/about)
|
|
109
101
|
end
|
|
110
102
|
|
|
111
103
|
context "Authentication:" do
|
|
@@ -183,6 +175,7 @@ class AuthenticationTest < MiniTest::Spec
|
|
|
183
175
|
Permissions::User.delete
|
|
184
176
|
Permissions::AccessKey.delete
|
|
185
177
|
Spontaneous.environment = :test
|
|
178
|
+
Permissions::UserLevel.reset!
|
|
186
179
|
Permissions::UserLevel.stubs(:level_file).returns(File.expand_path('../../fixtures/permissions', __FILE__) / 'config/user_levels.yml')
|
|
187
180
|
|
|
188
181
|
@root = SitePage.create
|
|
@@ -254,7 +247,7 @@ class AuthenticationTest < MiniTest::Spec
|
|
|
254
247
|
end
|
|
255
248
|
|
|
256
249
|
should "get access to CSS files" do
|
|
257
|
-
get "/@spontaneous/css/
|
|
250
|
+
get "/@spontaneous/css/spontaneous.css"
|
|
258
251
|
assert last_response.status == 200
|
|
259
252
|
end
|
|
260
253
|
|
|
@@ -291,6 +284,27 @@ class AuthenticationTest < MiniTest::Spec
|
|
|
291
284
|
last_response.headers["Location"].should =~ %r{/@spontaneous/103/preview$}
|
|
292
285
|
end
|
|
293
286
|
|
|
287
|
+
should "set the secure flag for cookies delivered behind https" do
|
|
288
|
+
clear_cookies
|
|
289
|
+
rack_mock_session.cookie_jar[S::Rack::AUTH_COOKIE].should be_nil
|
|
290
|
+
user = @admin_user
|
|
291
|
+
post "https://example.org/@spontaneous/login", {"user[login]" => user.login, "user[password]" => user.password}
|
|
292
|
+
cookies = rack_mock_session.cookie_jar.instance_variable_get("@cookies")
|
|
293
|
+
cookie = cookies.detect { |c| c.name == S::Rack::AUTH_COOKIE }
|
|
294
|
+
cookie.secure?.should be_true
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
should "set the secure flag for cookies delivered behind https when reauthenticating" do
|
|
298
|
+
clear_cookies
|
|
299
|
+
key = @admin_user.logged_in!
|
|
300
|
+
post "https://example.org/@spontaneous/reauthenticate", "api_key" => key.key_id, "origin" => "/99/edit"
|
|
301
|
+
cookies = rack_mock_session.cookie_jar.instance_variable_get("@cookies")
|
|
302
|
+
cookie = cookies.detect { |c| c.name == S::Rack::AUTH_COOKIE }
|
|
303
|
+
cookie.secure?.should be_true
|
|
304
|
+
cookie_options = cookie.instance_variable_get("@options")
|
|
305
|
+
cookie_options.key?("HttpOnly").should be_true
|
|
306
|
+
end
|
|
307
|
+
|
|
294
308
|
should "succeed and return an api key value for correct login over XHR" do
|
|
295
309
|
key = Spontaneous::Permissions::AccessKey.new
|
|
296
310
|
Spontaneous::Permissions::AccessKey.expects(:new).returns(key)
|
|
@@ -347,18 +361,18 @@ class AuthenticationTest < MiniTest::Spec
|
|
|
347
361
|
assert last_response.ok?, "Expected 200 but got #{last_response.status}"
|
|
348
362
|
end
|
|
349
363
|
|
|
364
|
+
should "be able to logout" do
|
|
365
|
+
auth_post "/@spontaneous/logout"
|
|
366
|
+
assert last_response.status == 401
|
|
367
|
+
rack_mock_session.cookie_jar.merge(last_response.headers["set-cookie"])
|
|
368
|
+
rack_mock_session.cookie_jar[Spontaneous::Rack::AUTH_COOKIE].value.should == ""
|
|
369
|
+
end
|
|
370
|
+
|
|
350
371
|
# context "providing an API key in the request" do
|
|
351
372
|
# should "be able to see previously forbidden fruit" do
|
|
352
373
|
# get "/@spontaneous/root"
|
|
353
374
|
# assert last_response.ok?
|
|
354
375
|
# end
|
|
355
|
-
|
|
356
|
-
# should "be able to load info about themselves" do
|
|
357
|
-
# get "/@spontaneous/user"
|
|
358
|
-
# assert last_response.ok?
|
|
359
|
-
# Spot::JSON.parse(last_response.body).should == @editor_user.export
|
|
360
|
-
# end
|
|
361
|
-
# end
|
|
362
376
|
end
|
|
363
377
|
|
|
364
378
|
end
|
|
@@ -400,7 +414,7 @@ class AuthenticationTest < MiniTest::Spec
|
|
|
400
414
|
value = "Updated #{version}"
|
|
401
415
|
field = root.fields[:root_level]
|
|
402
416
|
auth_post "/@spontaneous/save/#{root.id}", "field[#{field.schema_id}][unprocessed_value]" => value
|
|
403
|
-
assert last_response.status ==
|
|
417
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
404
418
|
root.reload.fields[:root_level].value.should == @root_copy.root_level.value
|
|
405
419
|
end
|
|
406
420
|
|
|
@@ -414,12 +428,12 @@ class AuthenticationTest < MiniTest::Spec
|
|
|
414
428
|
|
|
415
429
|
should "not be able to add to root level box" do
|
|
416
430
|
auth_post "/@spontaneous/add/#{root.id}/#{root.boxes[:root_level].schema_id}/#{AuthenticationTest::C.schema_id}"
|
|
417
|
-
assert last_response.status ==
|
|
431
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
418
432
|
end
|
|
419
433
|
|
|
420
434
|
should "not be able to add root level types to admin level box" do
|
|
421
435
|
auth_post "/@spontaneous/add/#{root.id}/#{root.boxes[:admin_level].schema_id}/#{AuthenticationTest::D.schema_id}"
|
|
422
|
-
assert last_response.status ==
|
|
436
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
423
437
|
end
|
|
424
438
|
|
|
425
439
|
should "be able to add to admin level box" do
|
|
@@ -432,27 +446,27 @@ class AuthenticationTest < MiniTest::Spec
|
|
|
432
446
|
value = "Updated #{version}"
|
|
433
447
|
field = root.fields[:editor_level]
|
|
434
448
|
auth_post "/@spontaneous/savebox/#{root.id}/#{root.boxes[:root_level].schema_id}", "field[#{field.schema_id}][unprocessed_value]" => value
|
|
435
|
-
assert last_response.status ==
|
|
449
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
436
450
|
end
|
|
437
451
|
|
|
438
452
|
should "not be able to update root level fields from admin level box" do
|
|
439
453
|
value = "Updated #{version}"
|
|
440
454
|
field = root.boxes[:admin_level].fields[:root_level]
|
|
441
455
|
auth_post "/@spontaneous/savebox/#{root.id}/#{root.boxes[:admin_level].schema_id}", "field[#{field.schema_id}][unprocessed_value]" => value
|
|
442
|
-
assert last_response.status ==
|
|
456
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
443
457
|
end
|
|
444
458
|
|
|
445
459
|
should "not be able to delete from root level box" do
|
|
446
|
-
piece = root.boxes[:root_level].
|
|
447
|
-
pieces = root.reload.boxes[:root_level].
|
|
460
|
+
piece = root.boxes[:root_level].contents.first
|
|
461
|
+
pieces = root.reload.boxes[:root_level].contents.length
|
|
448
462
|
auth_post "/@spontaneous/destroy/#{piece.id}"
|
|
449
|
-
assert last_response.status ==
|
|
450
|
-
root.reload.boxes[:root_level].
|
|
463
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
464
|
+
root.reload.boxes[:root_level].contents.length.should == pieces
|
|
451
465
|
end
|
|
452
466
|
should "not be able to wrap files in root level box" do
|
|
453
467
|
src_file = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
|
|
454
468
|
auth_post "/@spontaneous/file/wrap/#{root.id}/#{root.boxes[:root_level].schema_id}", "file" => ::Rack::Test::UploadedFile.new(src_file, "image/jpeg")
|
|
455
|
-
assert last_response.status ==
|
|
469
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
456
470
|
end
|
|
457
471
|
should "not be able to wrap files in box if allow permissions don't permit it" do
|
|
458
472
|
src_file = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
|
|
@@ -460,27 +474,27 @@ class AuthenticationTest < MiniTest::Spec
|
|
|
460
474
|
# editor_level box allows addition of type C but only by root
|
|
461
475
|
# so the following should throw a perms error:
|
|
462
476
|
auth_post "/@spontaneous/file/wrap/#{root.id}/#{root.boxes[:editor_level].schema_id}", "file" => ::Rack::Test::UploadedFile.new(src_file, "image/jpeg")
|
|
463
|
-
assert last_response.status ==
|
|
477
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
464
478
|
end
|
|
465
479
|
should "not be able to re-order pieces in root level box" do
|
|
466
|
-
piece = root.boxes[:root_level].
|
|
480
|
+
piece = root.boxes[:root_level].contents.last
|
|
467
481
|
auth_post "/@spontaneous/content/#{piece.id}/position/0"
|
|
468
|
-
assert last_response.status ==
|
|
469
|
-
root.reload.boxes[:root_level].
|
|
482
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
483
|
+
root.reload.boxes[:root_level].contents.last.id.should == piece.id
|
|
470
484
|
end
|
|
471
485
|
|
|
472
486
|
should "not be able to replace root level fields" do
|
|
473
|
-
piece = root.boxes[:root_level].
|
|
487
|
+
piece = root.boxes[:root_level].contents.first
|
|
474
488
|
src_file = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
|
|
475
489
|
field = piece.fields[:photo]
|
|
476
490
|
auth_post "/@spontaneous/file/replace/#{piece.id}", "file" => ::Rack::Test::UploadedFile.new(src_file, "image/jpeg"), "field" => field.schema_id
|
|
477
|
-
assert last_response.status ==
|
|
491
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
478
492
|
end
|
|
479
493
|
|
|
480
494
|
should "not be able to hide entries in root-level boxes" do
|
|
481
|
-
piece = root.boxes[:root_level].
|
|
495
|
+
piece = root.boxes[:root_level].contents.first
|
|
482
496
|
auth_post "/@spontaneous/toggle/#{piece.id}"
|
|
483
|
-
assert last_response.status ==
|
|
497
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
484
498
|
end
|
|
485
499
|
|
|
486
500
|
should "not be allowed to update path of pages without permission"
|
|
@@ -496,9 +510,8 @@ class AuthenticationTest < MiniTest::Spec
|
|
|
496
510
|
end
|
|
497
511
|
|
|
498
512
|
should "not be able to retrieve the list of changes" do
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
|
|
513
|
+
auth_get "/@spontaneous/publish/changes"
|
|
514
|
+
assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
|
|
502
515
|
end
|
|
503
516
|
end
|
|
504
517
|
end
|
data/test/unit/test_boxes.rb
CHANGED
|
@@ -338,16 +338,16 @@ class BoxesTest < MiniTest::Spec
|
|
|
338
338
|
@parent = Content[@parent.id]
|
|
339
339
|
child1.reload; child2.reload; child3.reload
|
|
340
340
|
@parent.images.contents.should == [child1]
|
|
341
|
-
@parent.images.
|
|
341
|
+
@parent.images.contents.should == [child1]
|
|
342
|
+
@parent.words.contents.should == [child2]
|
|
342
343
|
@parent.words.contents.should == [child2]
|
|
343
|
-
@parent.
|
|
344
|
-
|
|
345
|
-
child1.
|
|
346
|
-
child1.pieces.should == [child3]
|
|
344
|
+
@parent.contents.should == [child1, child2]
|
|
345
|
+
child1.images.contents.should == [child3]
|
|
346
|
+
child1.contents.should == [child3]
|
|
347
347
|
|
|
348
|
-
@parent.images.
|
|
349
|
-
@parent.words.
|
|
350
|
-
@parent.
|
|
348
|
+
@parent.images.contents.first.box.should == @parent.images
|
|
349
|
+
@parent.words.contents.first.box.should == @parent.words
|
|
350
|
+
@parent.contents.first.box.should == @parent.images
|
|
351
351
|
end
|
|
352
352
|
|
|
353
353
|
should "choose correct style" do
|
|
@@ -358,9 +358,10 @@ class BoxesTest < MiniTest::Spec
|
|
|
358
358
|
styled.one << child1
|
|
359
359
|
styled.two << child2
|
|
360
360
|
styled.save
|
|
361
|
-
styled = Content
|
|
362
|
-
|
|
363
|
-
styled.
|
|
361
|
+
styled = Content.first :id => styled.id
|
|
362
|
+
|
|
363
|
+
styled.one.contents.first.style.name.should == :blank2
|
|
364
|
+
styled.two.contents.first.style.name.should == :blank3
|
|
364
365
|
end
|
|
365
366
|
|
|
366
367
|
should "be insertable at any position" do
|
|
@@ -443,12 +444,12 @@ class BoxesTest < MiniTest::Spec
|
|
|
443
444
|
# end
|
|
444
445
|
|
|
445
446
|
should "allow all styles by default" do
|
|
446
|
-
Parent.allowed[2].styles.should == Allowed3.styles
|
|
447
|
+
Parent.allowed[2].styles(nil).should == Allowed3.styles
|
|
447
448
|
end
|
|
448
449
|
|
|
449
450
|
should "have a list of allowable styles" do
|
|
450
|
-
Parent.allowed[1].styles.length.should == 2
|
|
451
|
-
Parent.allowed[1].styles.map { |s| s.name }.should == [:ringo, :george]
|
|
451
|
+
Parent.allowed[1].styles(nil).length.should == 2
|
|
452
|
+
Parent.allowed[1].styles(nil).map { |s| s.name }.should == [:ringo, :george]
|
|
452
453
|
end
|
|
453
454
|
|
|
454
455
|
# TODO: decide on whether verifying style names is a good idea
|
|
@@ -460,7 +461,7 @@ class BoxesTest < MiniTest::Spec
|
|
|
460
461
|
a = Allowable.new
|
|
461
462
|
b = Allowed2.new
|
|
462
463
|
a.parents << b
|
|
463
|
-
a.parents.
|
|
464
|
+
a.parents.contents.first.style.prototype.should == Allowed2.styles[:ringo]
|
|
464
465
|
end
|
|
465
466
|
|
|
466
467
|
should "know what the available styles are for an entry" do
|
|
@@ -563,6 +564,10 @@ class BoxesTest < MiniTest::Spec
|
|
|
563
564
|
@c.boxes.inner.render.should == "[a][b][f]"
|
|
564
565
|
@c.boxes.outer.render.should == "[c][d][e]"
|
|
565
566
|
end
|
|
567
|
+
|
|
568
|
+
should "return an empty array when asking for an unknown box group" do
|
|
569
|
+
@a.boxes.group(:nothing).should == []
|
|
570
|
+
end
|
|
566
571
|
end
|
|
567
572
|
end
|
|
568
573
|
|