discourse-ember-source 3.5.1.1 → 3.5.1.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/lib/ember/version.rb +1 -1
- metadata +2 -740
- data/.gitignore +0 -9
- data/.travis.yml +0 -5
- data/Gemfile +0 -6
- data/LICENSE.txt +0 -21
- data/README +0 -18
- data/README.md +0 -39
- data/Rakefile +0 -27
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/discourse-ember-source-3.5.1.0.gem +0 -0
- data/dist/ember-all.debug.map +0 -1
- data/dist/ember-template-compiler.map +0 -1
- data/dist/ember-testing.map +0 -1
- data/dist/ember-tests.map +0 -1
- data/dist/ember-tests.prod.map +0 -1
- data/dist/ember.debug.map +0 -1
- data/dist/ember.min.map +0 -1
- data/dist/ember.prod.map +0 -1
- data/dist/es/@ember/application/globals-resolver.js +0 -425
- data/dist/es/@ember/application/index.js +0 -3
- data/dist/es/@ember/application/instance.js +0 -513
- data/dist/es/@ember/application/lib/application.js +0 -1139
- data/dist/es/@ember/application/lib/lazy_load.js +0 -69
- data/dist/es/@ember/application/lib/validate-type.js +0 -24
- data/dist/es/@ember/application/tests/application_instance_test.js +0 -230
- data/dist/es/@ember/application/tests/application_test.js +0 -470
- data/dist/es/@ember/application/tests/bootstrap-test.js +0 -28
- data/dist/es/@ember/application/tests/dependency_injection/custom_resolver_test.js +0 -32
- data/dist/es/@ember/application/tests/dependency_injection/default_resolver_test.js +0 -363
- data/dist/es/@ember/application/tests/dependency_injection/normalization_test.js +0 -70
- data/dist/es/@ember/application/tests/dependency_injection/to_string_test.js +0 -71
- data/dist/es/@ember/application/tests/dependency_injection_test.js +0 -93
- data/dist/es/@ember/application/tests/initializers_test.js +0 -391
- data/dist/es/@ember/application/tests/instance_initializers_test.js +0 -395
- data/dist/es/@ember/application/tests/lazy_load_test.js +0 -79
- data/dist/es/@ember/application/tests/logging_test.js +0 -179
- data/dist/es/@ember/application/tests/readiness_test.js +0 -138
- data/dist/es/@ember/application/tests/reset_test.js +0 -185
- data/dist/es/@ember/application/tests/visit_test.js +0 -783
- data/dist/es/@ember/canary-features/index.js +0 -76
- data/dist/es/@ember/controller/index.js +0 -50
- data/dist/es/@ember/controller/lib/controller_mixin.js +0 -42
- data/dist/es/@ember/controller/tests/controller_test.js +0 -209
- data/dist/es/@ember/debug/index.js +0 -264
- data/dist/es/@ember/debug/lib/deprecate.js +0 -198
- data/dist/es/@ember/debug/lib/handlers.js +0 -22
- data/dist/es/@ember/debug/lib/testing.js +0 -7
- data/dist/es/@ember/debug/lib/warn.js +0 -107
- data/dist/es/@ember/debug/tests/handlers-test.js +0 -144
- data/dist/es/@ember/debug/tests/main_test.js +0 -444
- data/dist/es/@ember/deprecated-features/index.js +0 -21
- data/dist/es/@ember/engine/index.js +0 -532
- data/dist/es/@ember/engine/instance.js +0 -228
- data/dist/es/@ember/engine/lib/engine-parent.js +0 -32
- data/dist/es/@ember/engine/tests/engine_initializers_test.js +0 -366
- data/dist/es/@ember/engine/tests/engine_instance_initializers_test.js +0 -409
- data/dist/es/@ember/engine/tests/engine_instance_test.js +0 -115
- data/dist/es/@ember/engine/tests/engine_parent_test.js +0 -20
- data/dist/es/@ember/engine/tests/engine_test.js +0 -121
- data/dist/es/@ember/error/index.js +0 -36
- data/dist/es/@ember/error/tests/index_test.js +0 -19
- data/dist/es/@ember/instrumentation/index.js +0 -240
- data/dist/es/@ember/instrumentation/tests/index-test.js +0 -214
- data/dist/es/@ember/map/index.js +0 -218
- data/dist/es/@ember/map/lib/ordered-set.js +0 -186
- data/dist/es/@ember/map/lib/utils.js +0 -29
- data/dist/es/@ember/map/tests/map_test.js +0 -578
- data/dist/es/@ember/map/with-default.js +0 -87
- data/dist/es/@ember/object/computed.js +0 -35
- data/dist/es/@ember/object/lib/computed/computed_macros.js +0 -742
- data/dist/es/@ember/object/lib/computed/reduce_computed_macros.js +0 -894
- data/dist/es/@ember/object/tests/computed/computed_macros_test.js +0 -533
- data/dist/es/@ember/object/tests/computed/reduce_computed_macros_test.js +0 -2243
- data/dist/es/@ember/polyfills/index.js +0 -3
- data/dist/es/@ember/polyfills/lib/assign.js +0 -43
- data/dist/es/@ember/polyfills/lib/merge.js +0 -35
- data/dist/es/@ember/polyfills/tests/assign_test.js +0 -64
- data/dist/es/@ember/runloop/index.js +0 -749
- data/dist/es/@ember/runloop/tests/debounce_test.js +0 -87
- data/dist/es/@ember/runloop/tests/later_test.js +0 -264
- data/dist/es/@ember/runloop/tests/next_test.js +0 -56
- data/dist/es/@ember/runloop/tests/once_test.js +0 -62
- data/dist/es/@ember/runloop/tests/onerror_test.js +0 -59
- data/dist/es/@ember/runloop/tests/run_bind_test.js +0 -59
- data/dist/es/@ember/runloop/tests/run_test.js +0 -28
- data/dist/es/@ember/runloop/tests/schedule_test.js +0 -86
- data/dist/es/@ember/runloop/tests/sync_test.js +0 -32
- data/dist/es/@ember/runloop/tests/unwind_test.js +0 -54
- data/dist/es/@ember/service/index.js +0 -57
- data/dist/es/@ember/string/index.js +0 -362
- data/dist/es/@ember/string/lib/string_registry.js +0 -13
- data/dist/es/@ember/string/tests/camelize_test.js +0 -53
- data/dist/es/@ember/string/tests/capitalize_test.js +0 -58
- data/dist/es/@ember/string/tests/classify_test.js +0 -79
- data/dist/es/@ember/string/tests/dasherize_test.js +0 -57
- data/dist/es/@ember/string/tests/decamelize_test.js +0 -51
- data/dist/es/@ember/string/tests/loc_test.js +0 -76
- data/dist/es/@ember/string/tests/underscore_test.js +0 -51
- data/dist/es/@ember/string/tests/w_test.js +0 -39
- data/dist/es/@glimmer/compiler.js +0 -1226
- data/dist/es/@glimmer/encoder.js +0 -39
- data/dist/es/@glimmer/low-level.js +0 -82
- data/dist/es/@glimmer/node.js +0 -112
- data/dist/es/@glimmer/opcode-compiler.js +0 -1999
- data/dist/es/@glimmer/program.js +0 -405
- data/dist/es/@glimmer/reference.js +0 -478
- data/dist/es/@glimmer/runtime.js +0 -4086
- data/dist/es/@glimmer/syntax.js +0 -1424
- data/dist/es/@glimmer/util.js +0 -189
- data/dist/es/@glimmer/vm.js +0 -27
- data/dist/es/@glimmer/wire-format.js +0 -56
- data/dist/es/backburner.js +0 -936
- data/dist/es/container/index.js +0 -8
- data/dist/es/container/lib/container.js +0 -437
- data/dist/es/container/lib/registry.js +0 -646
- data/dist/es/container/tests/container_test.js +0 -872
- data/dist/es/container/tests/owner_test.js +0 -20
- data/dist/es/container/tests/registry_test.js +0 -943
- data/dist/es/dag-map.js +0 -209
- data/dist/es/ember-browser-environment/index.js +0 -8
- data/dist/es/ember-browser-environment/lib/has-dom.js +0 -19
- data/dist/es/ember-console/index.js +0 -177
- data/dist/es/ember-environment/index.js +0 -3
- data/dist/es/ember-environment/lib/context.js +0 -20
- data/dist/es/ember-environment/lib/env.js +0 -185
- data/dist/es/ember-environment/lib/global.js +0 -14
- data/dist/es/ember-error-handling/index.js +0 -22
- data/dist/es/ember-extension-support/index.js +0 -2
- data/dist/es/ember-extension-support/lib/container_debug_adapter.js +0 -99
- data/dist/es/ember-extension-support/lib/data_adapter.js +0 -493
- data/dist/es/ember-extension-support/tests/container_debug_adapter_test.js +0 -73
- data/dist/es/ember-extension-support/tests/data_adapter_test.js +0 -301
- data/dist/es/ember-glimmer/index.js +0 -286
- data/dist/es/ember-glimmer/lib/compile-time-lookup.js +0 -37
- data/dist/es/ember-glimmer/lib/component-managers/abstract.js +0 -49
- data/dist/es/ember-glimmer/lib/component-managers/curly.js +0 -395
- data/dist/es/ember-glimmer/lib/component-managers/custom.js +0 -145
- data/dist/es/ember-glimmer/lib/component-managers/definition-state.js +0 -1
- data/dist/es/ember-glimmer/lib/component-managers/mount.js +0 -103
- data/dist/es/ember-glimmer/lib/component-managers/outlet.js +0 -114
- data/dist/es/ember-glimmer/lib/component-managers/render.js +0 -112
- data/dist/es/ember-glimmer/lib/component-managers/root.js +0 -74
- data/dist/es/ember-glimmer/lib/component-managers/template-only.js +0 -46
- data/dist/es/ember-glimmer/lib/component.js +0 -633
- data/dist/es/ember-glimmer/lib/components/checkbox.js +0 -57
- data/dist/es/ember-glimmer/lib/components/link-to.js +0 -777
- data/dist/es/ember-glimmer/lib/components/text_area.js +0 -236
- data/dist/es/ember-glimmer/lib/components/text_field.js +0 -145
- data/dist/es/ember-glimmer/lib/dom.js +0 -3
- data/dist/es/ember-glimmer/lib/environment.js +0 -102
- data/dist/es/ember-glimmer/lib/helper.js +0 -128
- data/dist/es/ember-glimmer/lib/helpers/-class.js +0 -23
- data/dist/es/ember-glimmer/lib/helpers/-html-safe.js +0 -9
- data/dist/es/ember-glimmer/lib/helpers/-input-type.js +0 -11
- data/dist/es/ember-glimmer/lib/helpers/-normalize-class.js +0 -22
- data/dist/es/ember-glimmer/lib/helpers/action.js +0 -360
- data/dist/es/ember-glimmer/lib/helpers/component.js +0 -135
- data/dist/es/ember-glimmer/lib/helpers/concat.js +0 -38
- data/dist/es/ember-glimmer/lib/helpers/each-in.js +0 -126
- data/dist/es/ember-glimmer/lib/helpers/get.js +0 -100
- data/dist/es/ember-glimmer/lib/helpers/hash.js +0 -44
- data/dist/es/ember-glimmer/lib/helpers/if-unless.js +0 -142
- data/dist/es/ember-glimmer/lib/helpers/loc.js +0 -40
- data/dist/es/ember-glimmer/lib/helpers/log.js +0 -25
- data/dist/es/ember-glimmer/lib/helpers/mut.js +0 -107
- data/dist/es/ember-glimmer/lib/helpers/query-param.js +0 -31
- data/dist/es/ember-glimmer/lib/helpers/readonly.js +0 -104
- data/dist/es/ember-glimmer/lib/helpers/unbound.js +0 -36
- data/dist/es/ember-glimmer/lib/modifiers/action.js +0 -185
- data/dist/es/ember-glimmer/lib/protocol-for-url.js +0 -48
- data/dist/es/ember-glimmer/lib/renderer.js +0 -371
- data/dist/es/ember-glimmer/lib/resolver.js +0 -290
- data/dist/es/ember-glimmer/lib/setup-registry.js +0 -77
- data/dist/es/ember-glimmer/lib/syntax.js +0 -73
- data/dist/es/ember-glimmer/lib/syntax/-text-area.js +0 -8
- data/dist/es/ember-glimmer/lib/syntax/input.js +0 -173
- data/dist/es/ember-glimmer/lib/syntax/let.js +0 -50
- data/dist/es/ember-glimmer/lib/syntax/mount.js +0 -101
- data/dist/es/ember-glimmer/lib/syntax/outlet.js +0 -120
- data/dist/es/ember-glimmer/lib/syntax/render.js +0 -140
- data/dist/es/ember-glimmer/lib/syntax/utils.js +0 -6
- data/dist/es/ember-glimmer/lib/template-compiler.js +0 -7
- data/dist/es/ember-glimmer/lib/template.js +0 -16
- data/dist/es/ember-glimmer/lib/template_registry.js +0 -18
- data/dist/es/ember-glimmer/lib/templates/component.js +0 -2
- data/dist/es/ember-glimmer/lib/templates/empty.js +0 -2
- data/dist/es/ember-glimmer/lib/templates/link-to.js +0 -2
- data/dist/es/ember-glimmer/lib/templates/outlet.js +0 -2
- data/dist/es/ember-glimmer/lib/templates/root.js +0 -2
- data/dist/es/ember-glimmer/lib/utils/bindings.js +0 -180
- data/dist/es/ember-glimmer/lib/utils/curly-component-state-bucket.js +0 -36
- data/dist/es/ember-glimmer/lib/utils/custom-component-manager.js +0 -20
- data/dist/es/ember-glimmer/lib/utils/debug-stack.js +0 -57
- data/dist/es/ember-glimmer/lib/utils/iterable.js +0 -358
- data/dist/es/ember-glimmer/lib/utils/outlet.js +0 -89
- data/dist/es/ember-glimmer/lib/utils/process-args.js +0 -40
- data/dist/es/ember-glimmer/lib/utils/references.js +0 -325
- data/dist/es/ember-glimmer/lib/utils/serialization-first-node-helpers.js +0 -1
- data/dist/es/ember-glimmer/lib/utils/string.js +0 -98
- data/dist/es/ember-glimmer/lib/utils/to-bool.js +0 -9
- data/dist/es/ember-glimmer/lib/views/outlet.js +0 -71
- data/dist/es/ember-glimmer/tests/integration/application/actions-test.js +0 -107
- data/dist/es/ember-glimmer/tests/integration/application/engine-test.js +0 -912
- data/dist/es/ember-glimmer/tests/integration/application/rendering-test.js +0 -530
- data/dist/es/ember-glimmer/tests/integration/components/angle-bracket-invocation-test.js +0 -852
- data/dist/es/ember-glimmer/tests/integration/components/append-test.js +0 -742
- data/dist/es/ember-glimmer/tests/integration/components/attribute-bindings-test.js +0 -999
- data/dist/es/ember-glimmer/tests/integration/components/attrs-lookup-test.js +0 -268
- data/dist/es/ember-glimmer/tests/integration/components/class-bindings-test.js +0 -849
- data/dist/es/ember-glimmer/tests/integration/components/contextual-components-test.js +0 -1493
- data/dist/es/ember-glimmer/tests/integration/components/curly-components-test.js +0 -3705
- data/dist/es/ember-glimmer/tests/integration/components/destroy-test.js +0 -33
- data/dist/es/ember-glimmer/tests/integration/components/dynamic-components-test.js +0 -896
- data/dist/es/ember-glimmer/tests/integration/components/error-handling-test.js +0 -164
- data/dist/es/ember-glimmer/tests/integration/components/fragment-components-test.js +0 -285
- data/dist/es/ember-glimmer/tests/integration/components/instrumentation-compile-test.js +0 -108
- data/dist/es/ember-glimmer/tests/integration/components/instrumentation-test.js +0 -157
- data/dist/es/ember-glimmer/tests/integration/components/life-cycle-test.js +0 -1653
- data/dist/es/ember-glimmer/tests/integration/components/link-to-test.js +0 -218
- data/dist/es/ember-glimmer/tests/integration/components/local-lookup-test.js +0 -414
- data/dist/es/ember-glimmer/tests/integration/components/namespaced-lookup-test.js +0 -185
- data/dist/es/ember-glimmer/tests/integration/components/render-to-element-test.js +0 -0
- data/dist/es/ember-glimmer/tests/integration/components/target-action-test.js +0 -779
- data/dist/es/ember-glimmer/tests/integration/components/template-only-components-test.js +0 -225
- data/dist/es/ember-glimmer/tests/integration/components/to-string-test.js +0 -27
- data/dist/es/ember-glimmer/tests/integration/components/utils-test.js +0 -401
- data/dist/es/ember-glimmer/tests/integration/components/web-component-fallback-test.js +0 -35
- data/dist/es/ember-glimmer/tests/integration/components/will-destroy-element-hook-test.js +0 -40
- data/dist/es/ember-glimmer/tests/integration/content-test.js +0 -1759
- data/dist/es/ember-glimmer/tests/integration/custom-component-manager-test.js +0 -508
- data/dist/es/ember-glimmer/tests/integration/event-dispatcher-test.js +0 -607
- data/dist/es/ember-glimmer/tests/integration/helpers/-class-test.js +0 -76
- data/dist/es/ember-glimmer/tests/integration/helpers/closure-action-test.js +0 -1240
- data/dist/es/ember-glimmer/tests/integration/helpers/concat-test.js +0 -106
- data/dist/es/ember-glimmer/tests/integration/helpers/custom-helper-test.js +0 -672
- data/dist/es/ember-glimmer/tests/integration/helpers/element-action-test.js +0 -1595
- data/dist/es/ember-glimmer/tests/integration/helpers/get-test.js +0 -618
- data/dist/es/ember-glimmer/tests/integration/helpers/hash-test.js +0 -188
- data/dist/es/ember-glimmer/tests/integration/helpers/if-unless-test.js +0 -149
- data/dist/es/ember-glimmer/tests/integration/helpers/input-test.js +0 -827
- data/dist/es/ember-glimmer/tests/integration/helpers/loc-test.js +0 -103
- data/dist/es/ember-glimmer/tests/integration/helpers/log-test.js +0 -61
- data/dist/es/ember-glimmer/tests/integration/helpers/mut-test.js +0 -580
- data/dist/es/ember-glimmer/tests/integration/helpers/partial-test.js +0 -386
- data/dist/es/ember-glimmer/tests/integration/helpers/readonly-test.js +0 -293
- data/dist/es/ember-glimmer/tests/integration/helpers/render-test.js +0 -522
- data/dist/es/ember-glimmer/tests/integration/helpers/text-area-test.js +0 -166
- data/dist/es/ember-glimmer/tests/integration/helpers/unbound-test.js +0 -650
- data/dist/es/ember-glimmer/tests/integration/helpers/yield-test.js +0 -275
- data/dist/es/ember-glimmer/tests/integration/input-test.js +0 -242
- data/dist/es/ember-glimmer/tests/integration/mount-test.js +0 -424
- data/dist/es/ember-glimmer/tests/integration/outlet-test.js +0 -318
- data/dist/es/ember-glimmer/tests/integration/refinements-test.js +0 -74
- data/dist/es/ember-glimmer/tests/integration/render-settled-test.js +0 -72
- data/dist/es/ember-glimmer/tests/integration/svg-test.js +0 -158
- data/dist/es/ember-glimmer/tests/integration/syntax/each-in-test.js +0 -697
- data/dist/es/ember-glimmer/tests/integration/syntax/each-test.js +0 -1251
- data/dist/es/ember-glimmer/tests/integration/syntax/experimental-syntax-test.js +0 -42
- data/dist/es/ember-glimmer/tests/integration/syntax/if-unless-test.js +0 -108
- data/dist/es/ember-glimmer/tests/integration/syntax/in-element-test.js +0 -119
- data/dist/es/ember-glimmer/tests/integration/syntax/let-test.js +0 -390
- data/dist/es/ember-glimmer/tests/integration/syntax/with-dynamic-var-test.js +0 -36
- data/dist/es/ember-glimmer/tests/integration/syntax/with-test.js +0 -422
- data/dist/es/ember-glimmer/tests/unit/outlet-test.js +0 -48
- data/dist/es/ember-glimmer/tests/unit/runtime-resolver-cache-test.js +0 -263
- data/dist/es/ember-glimmer/tests/unit/template-factory-test.js +0 -67
- data/dist/es/ember-glimmer/tests/unit/utils/debug-stack-test.js +0 -38
- data/dist/es/ember-glimmer/tests/utils/abstract-test-case.js +0 -1
- data/dist/es/ember-glimmer/tests/utils/helpers.js +0 -15
- data/dist/es/ember-glimmer/tests/utils/shared-conditional-tests.js +0 -965
- data/dist/es/ember-glimmer/tests/utils/string-test.js +0 -47
- data/dist/es/ember-glimmer/tests/utils/test-case.js +0 -6
- data/dist/es/ember-glimmer/tests/utils/test-helpers.js +0 -1
- data/dist/es/ember-meta/index.js +0 -1
- data/dist/es/ember-meta/lib/meta.js +0 -623
- data/dist/es/ember-meta/tests/meta_test.js +0 -169
- data/dist/es/ember-metal/index.js +0 -33
- data/dist/es/ember-metal/lib/alias.js +0 -80
- data/dist/es/ember-metal/lib/array.js +0 -55
- data/dist/es/ember-metal/lib/array_events.js +0 -65
- data/dist/es/ember-metal/lib/chains.js +0 -315
- data/dist/es/ember-metal/lib/change_event.js +0 -4
- data/dist/es/ember-metal/lib/computed.js +0 -526
- data/dist/es/ember-metal/lib/computed_cache.js +0 -58
- data/dist/es/ember-metal/lib/dependent_keys.js +0 -34
- data/dist/es/ember-metal/lib/deprecate_property.js +0 -34
- data/dist/es/ember-metal/lib/descriptor.js +0 -28
- data/dist/es/ember-metal/lib/each_proxy.js +0 -106
- data/dist/es/ember-metal/lib/each_proxy_events.js +0 -13
- data/dist/es/ember-metal/lib/events.js +0 -174
- data/dist/es/ember-metal/lib/expand_properties.js +0 -64
- data/dist/es/ember-metal/lib/get_properties.js +0 -45
- data/dist/es/ember-metal/lib/injected_property.js +0 -53
- data/dist/es/ember-metal/lib/is_blank.js +0 -34
- data/dist/es/ember-metal/lib/is_empty.js +0 -63
- data/dist/es/ember-metal/lib/is_none.js +0 -27
- data/dist/es/ember-metal/lib/is_present.js +0 -38
- data/dist/es/ember-metal/lib/libraries.js +0 -80
- data/dist/es/ember-metal/lib/mixin.js +0 -646
- data/dist/es/ember-metal/lib/namespace_search.js +0 -166
- data/dist/es/ember-metal/lib/observer.js +0 -34
- data/dist/es/ember-metal/lib/observer_set.js +0 -48
- data/dist/es/ember-metal/lib/path_cache.js +0 -5
- data/dist/es/ember-metal/lib/properties.js +0 -192
- data/dist/es/ember-metal/lib/property_events.js +0 -198
- data/dist/es/ember-metal/lib/property_get.js +0 -160
- data/dist/es/ember-metal/lib/property_set.js +0 -157
- data/dist/es/ember-metal/lib/set_properties.js +0 -43
- data/dist/es/ember-metal/lib/tags.js +0 -81
- data/dist/es/ember-metal/lib/tracked.js +0 -201
- data/dist/es/ember-metal/lib/transaction.js +0 -137
- data/dist/es/ember-metal/lib/watch_key.js +0 -113
- data/dist/es/ember-metal/lib/watch_path.js +0 -24
- data/dist/es/ember-metal/lib/watching.js +0 -54
- data/dist/es/ember-metal/tests/accessors/get_path_test.js +0 -82
- data/dist/es/ember-metal/tests/accessors/get_properties_test.js +0 -36
- data/dist/es/ember-metal/tests/accessors/get_test.js +0 -335
- data/dist/es/ember-metal/tests/accessors/mandatory_setters_test.js +0 -470
- data/dist/es/ember-metal/tests/accessors/set_path_test.js +0 -97
- data/dist/es/ember-metal/tests/accessors/set_test.js +0 -128
- data/dist/es/ember-metal/tests/alias_test.js +0 -167
- data/dist/es/ember-metal/tests/chains_test.js +0 -210
- data/dist/es/ember-metal/tests/computed_test.js +0 -1040
- data/dist/es/ember-metal/tests/descriptor_test.js +0 -368
- data/dist/es/ember-metal/tests/events_test.js +0 -210
- data/dist/es/ember-metal/tests/expand_properties_test.js +0 -119
- data/dist/es/ember-metal/tests/injected_property_test.js +0 -76
- data/dist/es/ember-metal/tests/is_blank_test.js +0 -29
- data/dist/es/ember-metal/tests/is_empty_test.js +0 -55
- data/dist/es/ember-metal/tests/is_none_test.js +0 -23
- data/dist/es/ember-metal/tests/is_present_test.js +0 -30
- data/dist/es/ember-metal/tests/libraries_test.js +0 -99
- data/dist/es/ember-metal/tests/main_test.js +0 -31
- data/dist/es/ember-metal/tests/mixin/alias_method_test.js +0 -91
- data/dist/es/ember-metal/tests/mixin/apply_test.js +0 -40
- data/dist/es/ember-metal/tests/mixin/computed_test.js +0 -166
- data/dist/es/ember-metal/tests/mixin/concatenated_properties_test.js +0 -117
- data/dist/es/ember-metal/tests/mixin/detect_test.js +0 -40
- data/dist/es/ember-metal/tests/mixin/introspection_test.js +0 -75
- data/dist/es/ember-metal/tests/mixin/merged_properties_test.js +0 -200
- data/dist/es/ember-metal/tests/mixin/method_test.js +0 -252
- data/dist/es/ember-metal/tests/mixin/observer_test.js +0 -202
- data/dist/es/ember-metal/tests/mixin/reopen_test.js +0 -53
- data/dist/es/ember-metal/tests/mixin/without_test.js +0 -22
- data/dist/es/ember-metal/tests/namespace_search_test.js +0 -16
- data/dist/es/ember-metal/tests/observer_test.js +0 -961
- data/dist/es/ember-metal/tests/performance_test.js +0 -81
- data/dist/es/ember-metal/tests/properties_test.js +0 -120
- data/dist/es/ember-metal/tests/property_did_change_hook.js +0 -73
- data/dist/es/ember-metal/tests/set_properties_test.js +0 -49
- data/dist/es/ember-metal/tests/tracked/computed_test.js +0 -67
- data/dist/es/ember-metal/tests/tracked/get_test.js +0 -86
- data/dist/es/ember-metal/tests/tracked/set_test.js +0 -44
- data/dist/es/ember-metal/tests/tracked/support.js +0 -37
- data/dist/es/ember-metal/tests/tracked/validation_test.js +0 -233
- data/dist/es/ember-metal/tests/watching/is_watching_test.js +0 -97
- data/dist/es/ember-metal/tests/watching/unwatch_test.js +0 -109
- data/dist/es/ember-metal/tests/watching/watch_test.js +0 -255
- data/dist/es/ember-owner/index.js +0 -66
- data/dist/es/ember-routing/index.js +0 -21
- data/dist/es/ember-routing/lib/ext/controller.js +0 -222
- data/dist/es/ember-routing/lib/location/api.js +0 -118
- data/dist/es/ember-routing/lib/location/auto_location.js +0 -323
- data/dist/es/ember-routing/lib/location/hash_location.js +0 -171
- data/dist/es/ember-routing/lib/location/history_location.js +0 -298
- data/dist/es/ember-routing/lib/location/none_location.js +0 -122
- data/dist/es/ember-routing/lib/location/util.js +0 -114
- data/dist/es/ember-routing/lib/services/router.js +0 -243
- data/dist/es/ember-routing/lib/services/routing.js +0 -101
- data/dist/es/ember-routing/lib/system/cache.js +0 -40
- data/dist/es/ember-routing/lib/system/controller_for.js +0 -14
- data/dist/es/ember-routing/lib/system/dsl.js +0 -208
- data/dist/es/ember-routing/lib/system/generate_controller.js +0 -54
- data/dist/es/ember-routing/lib/system/query_params.js +0 -6
- data/dist/es/ember-routing/lib/system/route.js +0 -2476
- data/dist/es/ember-routing/lib/system/router.js +0 -1607
- data/dist/es/ember-routing/lib/system/router_state.js +0 -26
- data/dist/es/ember-routing/lib/system/transition.js +0 -153
- data/dist/es/ember-routing/lib/utils.js +0 -230
- data/dist/es/ember-routing/tests/ext/controller_test.js +0 -85
- data/dist/es/ember-routing/tests/location/auto_location_test.js +0 -379
- data/dist/es/ember-routing/tests/location/hash_location_test.js +0 -207
- data/dist/es/ember-routing/tests/location/history_location_test.js +0 -322
- data/dist/es/ember-routing/tests/location/none_location_test.js +0 -88
- data/dist/es/ember-routing/tests/location/util_test.js +0 -159
- data/dist/es/ember-routing/tests/system/cache_test.js +0 -54
- data/dist/es/ember-routing/tests/system/controller_for_test.js +0 -75
- data/dist/es/ember-routing/tests/system/dsl_test.js +0 -413
- data/dist/es/ember-routing/tests/system/route_test.js +0 -587
- data/dist/es/ember-routing/tests/system/router_test.js +0 -287
- data/dist/es/ember-routing/tests/utils_test.js +0 -37
- data/dist/es/ember-runtime/.gitignore +0 -1
- data/dist/es/ember-runtime/README +0 -12
- data/dist/es/ember-runtime/index.js +0 -35
- data/dist/es/ember-runtime/lib/compare.js +0 -149
- data/dist/es/ember-runtime/lib/copy.js +0 -106
- data/dist/es/ember-runtime/lib/ext/function.js +0 -154
- data/dist/es/ember-runtime/lib/ext/rsvp.js +0 -59
- data/dist/es/ember-runtime/lib/is-equal.js +0 -60
- data/dist/es/ember-runtime/lib/mixins/-proxy.js +0 -109
- data/dist/es/ember-runtime/lib/mixins/action_handler.js +0 -222
- data/dist/es/ember-runtime/lib/mixins/array.js +0 -1661
- data/dist/es/ember-runtime/lib/mixins/comparable.js +0 -38
- data/dist/es/ember-runtime/lib/mixins/container_proxy.js +0 -154
- data/dist/es/ember-runtime/lib/mixins/copyable.js +0 -34
- data/dist/es/ember-runtime/lib/mixins/enumerable.js +0 -16
- data/dist/es/ember-runtime/lib/mixins/evented.js +0 -149
- data/dist/es/ember-runtime/lib/mixins/mutable_enumerable.js +0 -18
- data/dist/es/ember-runtime/lib/mixins/observable.js +0 -482
- data/dist/es/ember-runtime/lib/mixins/promise_proxy.js +0 -224
- data/dist/es/ember-runtime/lib/mixins/registry_proxy.js +0 -265
- data/dist/es/ember-runtime/lib/mixins/target_action_support.js +0 -172
- data/dist/es/ember-runtime/lib/system/array_proxy.js +0 -298
- data/dist/es/ember-runtime/lib/system/core_object.js +0 -1037
- data/dist/es/ember-runtime/lib/system/namespace.js +0 -69
- data/dist/es/ember-runtime/lib/system/object.js +0 -73
- data/dist/es/ember-runtime/lib/system/object_proxy.js +0 -81
- data/dist/es/ember-runtime/lib/type-of.js +0 -107
- data/dist/es/ember-runtime/tests/array/any-test.js +0 -55
- data/dist/es/ember-runtime/tests/array/compact-test.js +0 -12
- data/dist/es/ember-runtime/tests/array/every-test.js +0 -82
- data/dist/es/ember-runtime/tests/array/filter-test.js +0 -123
- data/dist/es/ember-runtime/tests/array/find-test.js +0 -86
- data/dist/es/ember-runtime/tests/array/firstObject-test.js +0 -27
- data/dist/es/ember-runtime/tests/array/forEach-test.js +0 -68
- data/dist/es/ember-runtime/tests/array/includes-test.js +0 -46
- data/dist/es/ember-runtime/tests/array/indexOf-test.js +0 -27
- data/dist/es/ember-runtime/tests/array/invoke-test.js +0 -60
- data/dist/es/ember-runtime/tests/array/isAny-test.js +0 -53
- data/dist/es/ember-runtime/tests/array/lastIndexOf-test.js +0 -78
- data/dist/es/ember-runtime/tests/array/lastObject-test.js +0 -31
- data/dist/es/ember-runtime/tests/array/map-test.js +0 -68
- data/dist/es/ember-runtime/tests/array/mapBy-test.js +0 -16
- data/dist/es/ember-runtime/tests/array/objectAt-test.js +0 -34
- data/dist/es/ember-runtime/tests/array/reduce-test.js +0 -24
- data/dist/es/ember-runtime/tests/array/reject-test.js +0 -134
- data/dist/es/ember-runtime/tests/array/sortBy-test.js +0 -23
- data/dist/es/ember-runtime/tests/array/toArray-test.js +0 -11
- data/dist/es/ember-runtime/tests/array/uniq-test.js +0 -27
- data/dist/es/ember-runtime/tests/array/uniqBy-test.js +0 -33
- data/dist/es/ember-runtime/tests/array/without-test.js +0 -39
- data/dist/es/ember-runtime/tests/copyable-array/copy-test.js +0 -12
- data/dist/es/ember-runtime/tests/core/compare_test.js +0 -89
- data/dist/es/ember-runtime/tests/core/copy_test.js +0 -47
- data/dist/es/ember-runtime/tests/core/isEqual_test.js +0 -65
- data/dist/es/ember-runtime/tests/core/is_array_test.js +0 -59
- data/dist/es/ember-runtime/tests/core/is_empty_test.js +0 -15
- data/dist/es/ember-runtime/tests/core/type_of_test.js +0 -54
- data/dist/es/ember-runtime/tests/ext/function_test.js +0 -121
- data/dist/es/ember-runtime/tests/ext/rsvp_test.js +0 -269
- data/dist/es/ember-runtime/tests/helpers/array.js +0 -336
- data/dist/es/ember-runtime/tests/inject_test.js +0 -51
- data/dist/es/ember-runtime/tests/legacy_1x/mixins/observable/chained_test.js +0 -63
- data/dist/es/ember-runtime/tests/legacy_1x/mixins/observable/observable_test.js +0 -892
- data/dist/es/ember-runtime/tests/legacy_1x/mixins/observable/propertyChanges_test.js +0 -142
- data/dist/es/ember-runtime/tests/legacy_1x/system/object/base_test.js +0 -98
- data/dist/es/ember-runtime/tests/legacy_1x/system/object/concatenated_test.js +0 -131
- data/dist/es/ember-runtime/tests/mixins/array_test.js +0 -400
- data/dist/es/ember-runtime/tests/mixins/comparable_test.js +0 -37
- data/dist/es/ember-runtime/tests/mixins/container_proxy_test.js +0 -48
- data/dist/es/ember-runtime/tests/mixins/enumerable_test.js +0 -17
- data/dist/es/ember-runtime/tests/mixins/evented_test.js +0 -23
- data/dist/es/ember-runtime/tests/mixins/mutable_enumerable_test.js +0 -17
- data/dist/es/ember-runtime/tests/mixins/observable_test.js +0 -137
- data/dist/es/ember-runtime/tests/mixins/promise_proxy_test.js +0 -593
- data/dist/es/ember-runtime/tests/mixins/target_action_support_test.js +0 -237
- data/dist/es/ember-runtime/tests/mutable-array/addObject-test.js +0 -76
- data/dist/es/ember-runtime/tests/mutable-array/clear-test.js +0 -64
- data/dist/es/ember-runtime/tests/mutable-array/insertAt-test.js +0 -216
- data/dist/es/ember-runtime/tests/mutable-array/popObject-test.js +0 -91
- data/dist/es/ember-runtime/tests/mutable-array/pushObject-test.js +0 -98
- data/dist/es/ember-runtime/tests/mutable-array/pushObjects-test.js +0 -12
- data/dist/es/ember-runtime/tests/mutable-array/removeAt-test.js +0 -187
- data/dist/es/ember-runtime/tests/mutable-array/removeObject-test.js +0 -77
- data/dist/es/ember-runtime/tests/mutable-array/removeObjects-test.js +0 -202
- data/dist/es/ember-runtime/tests/mutable-array/replace-test.js +0 -221
- data/dist/es/ember-runtime/tests/mutable-array/reverseObjects-test.js +0 -35
- data/dist/es/ember-runtime/tests/mutable-array/setObjects-test.js +0 -63
- data/dist/es/ember-runtime/tests/mutable-array/shiftObject-test.js +0 -105
- data/dist/es/ember-runtime/tests/mutable-array/unshiftObject-test.js +0 -99
- data/dist/es/ember-runtime/tests/mutable-array/unshiftObjects-test.js +0 -102
- data/dist/es/ember-runtime/tests/system/array_proxy/arranged_content_test.js +0 -275
- data/dist/es/ember-runtime/tests/system/array_proxy/array_observer_test.js +0 -51
- data/dist/es/ember-runtime/tests/system/array_proxy/content_change_test.js +0 -85
- data/dist/es/ember-runtime/tests/system/array_proxy/length_test.js +0 -201
- data/dist/es/ember-runtime/tests/system/array_proxy/watching_and_listening_test.js +0 -157
- data/dist/es/ember-runtime/tests/system/core_object_test.js +0 -114
- data/dist/es/ember-runtime/tests/system/namespace/base_test.js +0 -175
- data/dist/es/ember-runtime/tests/system/native_array/a_test.js +0 -16
- data/dist/es/ember-runtime/tests/system/native_array/copyable_suite_test.js +0 -19
- data/dist/es/ember-runtime/tests/system/native_array/replace_test.js +0 -17
- data/dist/es/ember-runtime/tests/system/object/computed_test.js +0 -352
- data/dist/es/ember-runtime/tests/system/object/create_test.js +0 -135
- data/dist/es/ember-runtime/tests/system/object/destroy_test.js +0 -146
- data/dist/es/ember-runtime/tests/system/object/detectInstance_test.js +0 -38
- data/dist/es/ember-runtime/tests/system/object/detect_test.js +0 -33
- data/dist/es/ember-runtime/tests/system/object/es-compatibility-test.js +0 -469
- data/dist/es/ember-runtime/tests/system/object/events_test.js +0 -156
- data/dist/es/ember-runtime/tests/system/object/extend_test.js +0 -153
- data/dist/es/ember-runtime/tests/system/object/observer_test.js +0 -216
- data/dist/es/ember-runtime/tests/system/object/reopenClass_test.js +0 -36
- data/dist/es/ember-runtime/tests/system/object/reopen_test.js +0 -48
- data/dist/es/ember-runtime/tests/system/object/strict-mode-test.js +0 -31
- data/dist/es/ember-runtime/tests/system/object/toString_test.js +0 -125
- data/dist/es/ember-runtime/tests/system/object_proxy_test.js +0 -314
- data/dist/es/ember-template-compiler/index.js +0 -26
- data/dist/es/ember-template-compiler/lib/compat.js +0 -16
- data/dist/es/ember-template-compiler/lib/plugins/assert-if-helper-without-arguments.js +0 -38
- data/dist/es/ember-template-compiler/lib/plugins/assert-input-helper-without-block.js +0 -20
- data/dist/es/ember-template-compiler/lib/plugins/assert-reserved-named-arguments.js +0 -26
- data/dist/es/ember-template-compiler/lib/plugins/assert-splattribute-expression.js +0 -27
- data/dist/es/ember-template-compiler/lib/plugins/deprecate-render-model.js +0 -38
- data/dist/es/ember-template-compiler/lib/plugins/deprecate-render.js +0 -41
- data/dist/es/ember-template-compiler/lib/plugins/deprecate-send-action.js +0 -42
- data/dist/es/ember-template-compiler/lib/plugins/index.js +0 -50
- data/dist/es/ember-template-compiler/lib/plugins/transform-action-syntax.js +0 -52
- data/dist/es/ember-template-compiler/lib/plugins/transform-angle-bracket-components.js +0 -10
- data/dist/es/ember-template-compiler/lib/plugins/transform-attrs-into-args.js +0 -62
- data/dist/es/ember-template-compiler/lib/plugins/transform-dot-component-invocation.js +0 -88
- data/dist/es/ember-template-compiler/lib/plugins/transform-each-in-into-each.js +0 -48
- data/dist/es/ember-template-compiler/lib/plugins/transform-has-block-syntax.js +0 -46
- data/dist/es/ember-template-compiler/lib/plugins/transform-in-element.js +0 -83
- data/dist/es/ember-template-compiler/lib/plugins/transform-inline-link-to.js +0 -31
- data/dist/es/ember-template-compiler/lib/plugins/transform-input-type-syntax.js +0 -52
- data/dist/es/ember-template-compiler/lib/plugins/transform-old-binding-syntax.js +0 -48
- data/dist/es/ember-template-compiler/lib/plugins/transform-old-class-binding-syntax.js +0 -102
- data/dist/es/ember-template-compiler/lib/plugins/transform-quoted-bindings-into-just-bindings.js +0 -34
- data/dist/es/ember-template-compiler/lib/plugins/transform-top-level-components.js +0 -41
- data/dist/es/ember-template-compiler/lib/system/bootstrap.js +0 -44
- data/dist/es/ember-template-compiler/lib/system/calculate-location-display.js +0 -20
- data/dist/es/ember-template-compiler/lib/system/compile-options.js +0 -71
- data/dist/es/ember-template-compiler/lib/system/compile.js +0 -28
- data/dist/es/ember-template-compiler/lib/system/dasherize-component-name.js +0 -13
- data/dist/es/ember-template-compiler/lib/system/initializer.js +0 -22
- data/dist/es/ember-template-compiler/lib/system/precompile.js +0 -18
- data/dist/es/ember-template-compiler/tests/plugins/assert-if-helper-without-arguments-test.js +0 -51
- data/dist/es/ember-template-compiler/tests/plugins/assert-input-helper-without-block-test.js +0 -17
- data/dist/es/ember-template-compiler/tests/plugins/assert-reserved-named-arguments-test.js +0 -416
- data/dist/es/ember-template-compiler/tests/plugins/assert-splattribute-expression-test.js +0 -57
- data/dist/es/ember-template-compiler/tests/plugins/deprecate-render-model-test.js +0 -19
- data/dist/es/ember-template-compiler/tests/plugins/deprecate-render-test.js +0 -19
- data/dist/es/ember-template-compiler/tests/plugins/deprecate-send-action-test.js +0 -29
- data/dist/es/ember-template-compiler/tests/plugins/transform-dot-component-invocation-test.js +0 -27
- data/dist/es/ember-template-compiler/tests/plugins/transform-inline-link-to-test.js +0 -15
- data/dist/es/ember-template-compiler/tests/plugins/transform-input-type-syntax-test.js +0 -25
- data/dist/es/ember-template-compiler/tests/system/bootstrap-test.js +0 -155
- data/dist/es/ember-template-compiler/tests/system/compile_options_test.js +0 -115
- data/dist/es/ember-template-compiler/tests/system/dasherize-component-name-test.js +0 -19
- data/dist/es/ember-testing/index.js +0 -10
- data/dist/es/ember-testing/lib/adapters/adapter.js +0 -58
- data/dist/es/ember-testing/lib/adapters/qunit.js +0 -47
- data/dist/es/ember-testing/lib/events.js +0 -136
- data/dist/es/ember-testing/lib/ext/application.js +0 -191
- data/dist/es/ember-testing/lib/ext/rsvp.js +0 -19
- data/dist/es/ember-testing/lib/helpers.js +0 -30
- data/dist/es/ember-testing/lib/helpers/-is-form-control.js +0 -16
- data/dist/es/ember-testing/lib/helpers/and_then.js +0 -3
- data/dist/es/ember-testing/lib/helpers/click.js +0 -36
- data/dist/es/ember-testing/lib/helpers/current_path.js +0 -27
- data/dist/es/ember-testing/lib/helpers/current_route_name.js +0 -25
- data/dist/es/ember-testing/lib/helpers/current_url.js +0 -27
- data/dist/es/ember-testing/lib/helpers/fill_in.js +0 -46
- data/dist/es/ember-testing/lib/helpers/find.js +0 -41
- data/dist/es/ember-testing/lib/helpers/find_with_assert.js +0 -34
- data/dist/es/ember-testing/lib/helpers/key_event.js +0 -36
- data/dist/es/ember-testing/lib/helpers/pause_test.js +0 -65
- data/dist/es/ember-testing/lib/helpers/trigger_event.js +0 -62
- data/dist/es/ember-testing/lib/helpers/visit.js +0 -42
- data/dist/es/ember-testing/lib/helpers/wait.js +0 -72
- data/dist/es/ember-testing/lib/initializers.js +0 -17
- data/dist/es/ember-testing/lib/setup_for_testing.js +0 -44
- data/dist/es/ember-testing/lib/support.js +0 -62
- data/dist/es/ember-testing/lib/test.js +0 -70
- data/dist/es/ember-testing/lib/test/adapter.js +0 -33
- data/dist/es/ember-testing/lib/test/helpers.js +0 -125
- data/dist/es/ember-testing/lib/test/on_inject_helpers.js +0 -38
- data/dist/es/ember-testing/lib/test/pending_requests.js +0 -24
- data/dist/es/ember-testing/lib/test/promise.js +0 -79
- data/dist/es/ember-testing/lib/test/run.js +0 -9
- data/dist/es/ember-testing/lib/test/waiters.js +0 -117
- data/dist/es/ember-testing/tests/acceptance_test.js +0 -478
- data/dist/es/ember-testing/tests/adapters/adapter_test.js +0 -31
- data/dist/es/ember-testing/tests/adapters/qunit_test.js +0 -50
- data/dist/es/ember-testing/tests/adapters_test.js +0 -405
- data/dist/es/ember-testing/tests/ext/rsvp_test.js +0 -124
- data/dist/es/ember-testing/tests/helper_registration_test.js +0 -98
- data/dist/es/ember-testing/tests/helpers_test.js +0 -1228
- data/dist/es/ember-testing/tests/integration_test.js +0 -106
- data/dist/es/ember-testing/tests/reexports_test.js +0 -26
- data/dist/es/ember-testing/tests/test/waiters-test.js +0 -145
- data/dist/es/ember-utils/index.js +0 -28
- data/dist/es/ember-utils/lib/cache.js +0 -36
- data/dist/es/ember-utils/lib/dictionary.js +0 -11
- data/dist/es/ember-utils/lib/guid.js +0 -120
- data/dist/es/ember-utils/lib/inspect.js +0 -112
- data/dist/es/ember-utils/lib/intern.js +0 -49
- data/dist/es/ember-utils/lib/invoke.js +0 -53
- data/dist/es/ember-utils/lib/is_proxy.js +0 -14
- data/dist/es/ember-utils/lib/lookup-descriptor.js +0 -11
- data/dist/es/ember-utils/lib/make-array.js +0 -7
- data/dist/es/ember-utils/lib/name.js +0 -9
- data/dist/es/ember-utils/lib/proxy-utils.js +0 -1
- data/dist/es/ember-utils/lib/spec.js +0 -14
- data/dist/es/ember-utils/lib/super.js +0 -83
- data/dist/es/ember-utils/lib/symbol-utils.js +0 -8
- data/dist/es/ember-utils/lib/symbol.js +0 -15
- data/dist/es/ember-utils/lib/to-string.js +0 -35
- data/dist/es/ember-utils/lib/weak_set.js +0 -18
- data/dist/es/ember-utils/tests/cache_test.js +0 -77
- data/dist/es/ember-utils/tests/can_invoke_test.js +0 -46
- data/dist/es/ember-utils/tests/checkHasSuper_test.js +0 -17
- data/dist/es/ember-utils/tests/generate_guid_test.js +0 -13
- data/dist/es/ember-utils/tests/guid_for_test.js +0 -101
- data/dist/es/ember-utils/tests/inspect_test.js +0 -146
- data/dist/es/ember-utils/tests/is_proxy_test.js +0 -18
- data/dist/es/ember-utils/tests/make_array_test.js +0 -41
- data/dist/es/ember-utils/tests/to-string-test.js +0 -32
- data/dist/es/ember-utils/tests/try_invoke_test.js +0 -48
- data/dist/es/ember-views/index.js +0 -28
- data/dist/es/ember-views/lib/compat/attrs.js +0 -3
- data/dist/es/ember-views/lib/compat/fallback-view-registry.js +0 -3
- data/dist/es/ember-views/lib/component_lookup.js +0 -27
- data/dist/es/ember-views/lib/mixins/action_support.js +0 -189
- data/dist/es/ember-views/lib/mixins/child_views_support.js +0 -27
- data/dist/es/ember-views/lib/mixins/class_names_support.js +0 -102
- data/dist/es/ember-views/lib/mixins/text_support.js +0 -333
- data/dist/es/ember-views/lib/mixins/view_state_support.js +0 -19
- data/dist/es/ember-views/lib/mixins/view_support.js +0 -452
- data/dist/es/ember-views/lib/system/action_manager.js +0 -14
- data/dist/es/ember-views/lib/system/event_dispatcher.js +0 -454
- data/dist/es/ember-views/lib/system/jquery.js +0 -29
- data/dist/es/ember-views/lib/system/jquery_event_deprecation.js +0 -61
- data/dist/es/ember-views/lib/system/lookup_partial.js +0 -55
- data/dist/es/ember-views/lib/system/utils.js +0 -201
- data/dist/es/ember-views/lib/utils/lookup-component.js +0 -58
- data/dist/es/ember-views/lib/views/core_view.js +0 -83
- data/dist/es/ember-views/lib/views/states.js +0 -48
- data/dist/es/ember-views/lib/views/states/default.js +0 -17
- data/dist/es/ember-views/lib/views/states/destroying.js +0 -16
- data/dist/es/ember-views/lib/views/states/has_element.js +0 -31
- data/dist/es/ember-views/lib/views/states/in_dom.js +0 -28
- data/dist/es/ember-views/lib/views/states/pre_render.js +0 -3
- data/dist/es/ember/index.js +0 -645
- data/dist/es/ember/tests/application_lifecycle_test.js +0 -188
- data/dist/es/ember/tests/component_context_test.js +0 -255
- data/dist/es/ember/tests/component_registration_test.js +0 -252
- data/dist/es/ember/tests/controller_test.js +0 -44
- data/dist/es/ember/tests/error_handler_test.js +0 -581
- data/dist/es/ember/tests/helpers/helper_registration_test.js +0 -103
- data/dist/es/ember/tests/helpers/link_to_test.js +0 -2103
- data/dist/es/ember/tests/helpers/link_to_test/link_to_transitioning_classes_test.js +0 -342
- data/dist/es/ember/tests/helpers/link_to_test/link_to_with_query_params_test.js +0 -694
- data/dist/es/ember/tests/homepage_example_test.js +0 -47
- data/dist/es/ember/tests/integration/multiple-app-test.js +0 -101
- data/dist/es/ember/tests/production_build_test.js +0 -34
- data/dist/es/ember/tests/reexports_test.js +0 -307
- data/dist/es/ember/tests/routing/decoupled_basic_test.js +0 -4506
- data/dist/es/ember/tests/routing/query_params_test.js +0 -1579
- data/dist/es/ember/tests/routing/query_params_test/model_dependent_state_with_query_params_test.js +0 -1117
- data/dist/es/ember/tests/routing/query_params_test/overlapping_query_params_test.js +0 -185
- data/dist/es/ember/tests/routing/query_params_test/query_param_async_get_handler_test.js +0 -327
- data/dist/es/ember/tests/routing/query_params_test/query_params_paramless_link_to_test.js +0 -37
- data/dist/es/ember/tests/routing/query_params_test/shared_state_test.js +0 -84
- data/dist/es/ember/tests/routing/router_map_test.js +0 -46
- data/dist/es/ember/tests/routing/router_service_test/basic_test.js +0 -95
- data/dist/es/ember/tests/routing/router_service_test/currenturl_lifecycle_test.js +0 -149
- data/dist/es/ember/tests/routing/router_service_test/isActive_test.js +0 -113
- data/dist/es/ember/tests/routing/router_service_test/replaceWith_test.js +0 -144
- data/dist/es/ember/tests/routing/router_service_test/transitionTo_test.js +0 -370
- data/dist/es/ember/tests/routing/router_service_test/urlFor_test.js +0 -307
- data/dist/es/ember/tests/routing/substates_test.js +0 -1110
- data/dist/es/ember/tests/routing/toplevel_dom_test.js +0 -37
- data/dist/es/ember/tests/service_injection_test.js +0 -278
- data/dist/es/ember/tests/view_instrumentation_test.js +0 -47
- data/dist/es/ember/version.js +0 -1
- data/dist/es/handlebars.js +0 -1268
- data/dist/es/internal-test-helpers/index.js +0 -31
- data/dist/es/internal-test-helpers/lib/.gitkeep +0 -0
- data/dist/es/internal-test-helpers/lib/apply-mixins.js +0 -37
- data/dist/es/internal-test-helpers/lib/browser-detect.js +0 -4
- data/dist/es/internal-test-helpers/lib/build-owner.js +0 -49
- data/dist/es/internal-test-helpers/lib/confirm-export.js +0 -45
- data/dist/es/internal-test-helpers/lib/ember-dev/assertion.js +0 -87
- data/dist/es/internal-test-helpers/lib/ember-dev/containers.js +0 -34
- data/dist/es/internal-test-helpers/lib/ember-dev/debug.js +0 -47
- data/dist/es/internal-test-helpers/lib/ember-dev/deprecation.js +0 -71
- data/dist/es/internal-test-helpers/lib/ember-dev/index.js +0 -19
- data/dist/es/internal-test-helpers/lib/ember-dev/method-call-tracker.js +0 -127
- data/dist/es/internal-test-helpers/lib/ember-dev/namespaces.js +0 -34
- data/dist/es/internal-test-helpers/lib/ember-dev/run-loop.js +0 -28
- data/dist/es/internal-test-helpers/lib/ember-dev/setup-qunit.js +0 -26
- data/dist/es/internal-test-helpers/lib/ember-dev/utils.js +0 -33
- data/dist/es/internal-test-helpers/lib/ember-dev/warning.js +0 -71
- data/dist/es/internal-test-helpers/lib/equal-inner-html.js +0 -37
- data/dist/es/internal-test-helpers/lib/equal-tokens.js +0 -53
- data/dist/es/internal-test-helpers/lib/factory.js +0 -65
- data/dist/es/internal-test-helpers/lib/get-all-property-names.js +0 -12
- data/dist/es/internal-test-helpers/lib/get-text-of.js +0 -3
- data/dist/es/internal-test-helpers/lib/matchers.js +0 -167
- data/dist/es/internal-test-helpers/lib/module-for.js +0 -89
- data/dist/es/internal-test-helpers/lib/registry-check.js +0 -28
- data/dist/es/internal-test-helpers/lib/run.js +0 -11
- data/dist/es/internal-test-helpers/lib/strip.js +0 -12
- data/dist/es/internal-test-helpers/lib/system/synthetic-events.js +0 -183
- data/dist/es/internal-test-helpers/lib/test-cases/abstract-application.js +0 -70
- data/dist/es/internal-test-helpers/lib/test-cases/abstract-rendering.js +0 -203
- data/dist/es/internal-test-helpers/lib/test-cases/abstract.js +0 -222
- data/dist/es/internal-test-helpers/lib/test-cases/application.js +0 -39
- data/dist/es/internal-test-helpers/lib/test-cases/autoboot-application.js +0 -34
- data/dist/es/internal-test-helpers/lib/test-cases/default-resolver-application.js +0 -43
- data/dist/es/internal-test-helpers/lib/test-cases/node-query.js +0 -120
- data/dist/es/internal-test-helpers/lib/test-cases/query-param.js +0 -124
- data/dist/es/internal-test-helpers/lib/test-cases/rendering.js +0 -14
- data/dist/es/internal-test-helpers/lib/test-cases/router.js +0 -26
- data/dist/es/internal-test-helpers/lib/test-cases/test-resolver-application.js +0 -40
- data/dist/es/internal-test-helpers/lib/test-resolver.js +0 -86
- data/dist/es/internal-test-helpers/tests/index-test.js +0 -10
- data/dist/es/route-recognizer.js +0 -685
- data/dist/es/router.js +0 -2454
- data/dist/es/rsvp.js +0 -2394
- data/dist/es/simple-html-tokenizer.js +0 -638
- data/dist/jquery/jquery.js +0 -10364
- data/dist/node/app-boot-test.js +0 -146
- data/dist/node/build-info-test.js +0 -177
- data/dist/node/component-rendering-test.js +0 -34
- data/dist/node/helpers/app-module.js +0 -198
- data/dist/node/helpers/assert-html-matches.js +0 -25
- data/dist/node/helpers/build-owner.js +0 -28
- data/dist/node/helpers/component-module.js +0 -137
- data/dist/node/sourcemap-test.js +0 -27
- data/dist/node/template-compiler-test.js +0 -45
- data/dist/node/visit-test.js +0 -349
- data/dist/qunit/qunit.css +0 -436
- data/dist/qunit/qunit.js +0 -5188
- data/dist/tests/index.html +0 -254
- data/ember-source.gemspec +0 -28
- data/node_modules/.yarn-integrity +0 -10
- data/yarn.lock +0 -4
|
@@ -1,4506 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
import { getOwner } from 'ember-owner';
|
|
3
|
-
import RSVP from 'rsvp';
|
|
4
|
-
import { compile } from 'ember-template-compiler';
|
|
5
|
-
import { ENV } from 'ember-environment';
|
|
6
|
-
import { Route, NoneLocation, HistoryLocation } from 'ember-routing';
|
|
7
|
-
import Controller from '@ember/controller';
|
|
8
|
-
import { Object as EmberObject, A as emberA } from 'ember-runtime';
|
|
9
|
-
import { moduleFor, ApplicationTestCase, runDestroy } from 'internal-test-helpers';
|
|
10
|
-
import { run } from '@ember/runloop';
|
|
11
|
-
import { Mixin, computed, set, addObserver, observer } from 'ember-metal';
|
|
12
|
-
import { getTextOf } from 'internal-test-helpers';
|
|
13
|
-
import { Component } from 'ember-glimmer';
|
|
14
|
-
import Engine from '@ember/engine';
|
|
15
|
-
import { Transition } from 'router';
|
|
16
|
-
|
|
17
|
-
let originalRenderSupport;
|
|
18
|
-
let originalConsoleError;
|
|
19
|
-
|
|
20
|
-
moduleFor(
|
|
21
|
-
'Basic Routing - Decoupled from global resolver',
|
|
22
|
-
class extends ApplicationTestCase {
|
|
23
|
-
constructor() {
|
|
24
|
-
super(...arguments);
|
|
25
|
-
this.addTemplate('home', '<h3 class="hours">Hours</h3>');
|
|
26
|
-
this.addTemplate('camelot', '<section id="camelot"><h3>Is a silly place</h3></section>');
|
|
27
|
-
this.addTemplate('homepage', '<h3 id="troll">Megatroll</h3><p>{{model.home}}</p>');
|
|
28
|
-
|
|
29
|
-
this.router.map(function() {
|
|
30
|
-
this.route('home', { path: '/' });
|
|
31
|
-
});
|
|
32
|
-
originalRenderSupport = ENV._ENABLE_RENDER_SUPPORT;
|
|
33
|
-
ENV._ENABLE_RENDER_SUPPORT = true;
|
|
34
|
-
originalConsoleError = console.error;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
teardown() {
|
|
38
|
-
super.teardown();
|
|
39
|
-
ENV._ENABLE_RENDER_SUPPORT = originalRenderSupport;
|
|
40
|
-
console.error = originalConsoleError;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
getController(name) {
|
|
44
|
-
return this.applicationInstance.lookup(`controller:${name}`);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
handleURLAborts(assert, path) {
|
|
48
|
-
run(() => {
|
|
49
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
50
|
-
router.handleURL(path).then(
|
|
51
|
-
function() {
|
|
52
|
-
assert.ok(false, 'url: `' + path + '` was NOT to be handled');
|
|
53
|
-
},
|
|
54
|
-
function(reason) {
|
|
55
|
-
assert.ok(
|
|
56
|
-
reason && reason.message === 'TransitionAborted',
|
|
57
|
-
'url: `' + path + '` was to be aborted'
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
);
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
get currentPath() {
|
|
65
|
-
return this.getController('application').get('currentPath');
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
get currentURL() {
|
|
69
|
-
return this.appRouter.get('currentURL');
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
handleURLRejectsWith(context, assert, path, expectedReason) {
|
|
73
|
-
return context
|
|
74
|
-
.visit(path)
|
|
75
|
-
.then(() => {
|
|
76
|
-
assert.ok(false, 'expected handleURLing: `' + path + '` to fail');
|
|
77
|
-
})
|
|
78
|
-
.catch(reason => {
|
|
79
|
-
assert.equal(reason, expectedReason);
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
['@test warn on URLs not included in the route set']() {
|
|
84
|
-
return this.visit('/').then(() => {
|
|
85
|
-
expectAssertion(() => {
|
|
86
|
-
this.visit('/what-is-this-i-dont-even');
|
|
87
|
-
}, /'\/what-is-this-i-dont-even' did not match any routes/);
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
['@test The Homepage'](assert) {
|
|
92
|
-
return this.visit('/').then(() => {
|
|
93
|
-
assert.equal(this.currentPath, 'home', 'currently on the home route');
|
|
94
|
-
|
|
95
|
-
let text = this.$('.hours').text();
|
|
96
|
-
assert.equal(text, 'Hours', 'the home template was rendered');
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
[`@test The Homepage and the Camelot page with multiple Router.map calls`](assert) {
|
|
101
|
-
this.router.map(function() {
|
|
102
|
-
this.route('camelot', { path: '/camelot' });
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
return this.visit('/camelot')
|
|
106
|
-
.then(() => {
|
|
107
|
-
assert.equal(this.currentPath, 'camelot');
|
|
108
|
-
|
|
109
|
-
let text = this.$('#camelot').text();
|
|
110
|
-
assert.equal(text, 'Is a silly place', 'the camelot template was rendered');
|
|
111
|
-
|
|
112
|
-
return this.visit('/');
|
|
113
|
-
})
|
|
114
|
-
.then(() => {
|
|
115
|
-
assert.equal(this.currentPath, 'home');
|
|
116
|
-
|
|
117
|
-
let text = this.$('.hours').text();
|
|
118
|
-
assert.equal(text, 'Hours', 'the home template was rendered');
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
[`@test The Homepage with explicit template name in renderTemplate`](assert) {
|
|
123
|
-
this.add(
|
|
124
|
-
'route:home',
|
|
125
|
-
Route.extend({
|
|
126
|
-
renderTemplate() {
|
|
127
|
-
this.render('homepage');
|
|
128
|
-
},
|
|
129
|
-
})
|
|
130
|
-
);
|
|
131
|
-
|
|
132
|
-
return this.visit('/').then(() => {
|
|
133
|
-
let text = this.$('#troll').text();
|
|
134
|
-
assert.equal(text, 'Megatroll', 'the homepage template was rendered');
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
[`@test an alternate template will pull in an alternate controller`](assert) {
|
|
139
|
-
this.add(
|
|
140
|
-
'route:home',
|
|
141
|
-
Route.extend({
|
|
142
|
-
renderTemplate() {
|
|
143
|
-
this.render('homepage');
|
|
144
|
-
},
|
|
145
|
-
})
|
|
146
|
-
);
|
|
147
|
-
this.add(
|
|
148
|
-
'controller:homepage',
|
|
149
|
-
Controller.extend({
|
|
150
|
-
model: {
|
|
151
|
-
home: 'Comes from homepage',
|
|
152
|
-
},
|
|
153
|
-
})
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
return this.visit('/').then(() => {
|
|
157
|
-
let text = this.$('p').text();
|
|
158
|
-
|
|
159
|
-
assert.equal(text, 'Comes from homepage', 'the homepage template was rendered');
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
[`@test An alternate template will pull in an alternate controller instead of controllerName`](
|
|
164
|
-
assert
|
|
165
|
-
) {
|
|
166
|
-
this.add(
|
|
167
|
-
'route:home',
|
|
168
|
-
Route.extend({
|
|
169
|
-
controllerName: 'foo',
|
|
170
|
-
renderTemplate() {
|
|
171
|
-
this.render('homepage');
|
|
172
|
-
},
|
|
173
|
-
})
|
|
174
|
-
);
|
|
175
|
-
this.add(
|
|
176
|
-
'controller:foo',
|
|
177
|
-
Controller.extend({
|
|
178
|
-
model: {
|
|
179
|
-
home: 'Comes from foo',
|
|
180
|
-
},
|
|
181
|
-
})
|
|
182
|
-
);
|
|
183
|
-
this.add(
|
|
184
|
-
'controller:homepage',
|
|
185
|
-
Controller.extend({
|
|
186
|
-
model: {
|
|
187
|
-
home: 'Comes from homepage',
|
|
188
|
-
},
|
|
189
|
-
})
|
|
190
|
-
);
|
|
191
|
-
|
|
192
|
-
return this.visit('/').then(() => {
|
|
193
|
-
let text = this.$('p').text();
|
|
194
|
-
|
|
195
|
-
assert.equal(text, 'Comes from homepage', 'the homepage template was rendered');
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
[`@test The template will pull in an alternate controller via key/value`](assert) {
|
|
200
|
-
this.router.map(function() {
|
|
201
|
-
this.route('homepage', { path: '/' });
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
this.add(
|
|
205
|
-
'route:homepage',
|
|
206
|
-
Route.extend({
|
|
207
|
-
renderTemplate() {
|
|
208
|
-
this.render({ controller: 'home' });
|
|
209
|
-
},
|
|
210
|
-
})
|
|
211
|
-
);
|
|
212
|
-
this.add(
|
|
213
|
-
'controller:home',
|
|
214
|
-
Controller.extend({
|
|
215
|
-
model: {
|
|
216
|
-
home: 'Comes from home.',
|
|
217
|
-
},
|
|
218
|
-
})
|
|
219
|
-
);
|
|
220
|
-
|
|
221
|
-
return this.visit('/').then(() => {
|
|
222
|
-
let text = this.$('p').text();
|
|
223
|
-
|
|
224
|
-
assert.equal(
|
|
225
|
-
text,
|
|
226
|
-
'Comes from home.',
|
|
227
|
-
'the homepage template was rendered from data from the HomeController'
|
|
228
|
-
);
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
[`@test The Homepage with explicit template name in renderTemplate and controller`](assert) {
|
|
233
|
-
this.add(
|
|
234
|
-
'controller:home',
|
|
235
|
-
Controller.extend({
|
|
236
|
-
model: {
|
|
237
|
-
home: 'YES I AM HOME',
|
|
238
|
-
},
|
|
239
|
-
})
|
|
240
|
-
);
|
|
241
|
-
this.add(
|
|
242
|
-
'route:home',
|
|
243
|
-
Route.extend({
|
|
244
|
-
renderTemplate() {
|
|
245
|
-
this.render('homepage');
|
|
246
|
-
},
|
|
247
|
-
})
|
|
248
|
-
);
|
|
249
|
-
|
|
250
|
-
return this.visit('/').then(() => {
|
|
251
|
-
let text = this.$('p').text();
|
|
252
|
-
|
|
253
|
-
assert.equal(text, 'YES I AM HOME', 'The homepage template was rendered');
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
[`@test Model passed via renderTemplate model is set as controller's model`](assert) {
|
|
258
|
-
this.addTemplate('bio', '<p>{{model.name}}</p>');
|
|
259
|
-
this.add(
|
|
260
|
-
'route:home',
|
|
261
|
-
Route.extend({
|
|
262
|
-
renderTemplate() {
|
|
263
|
-
this.render('bio', {
|
|
264
|
-
model: { name: 'emberjs' },
|
|
265
|
-
});
|
|
266
|
-
},
|
|
267
|
-
})
|
|
268
|
-
);
|
|
269
|
-
|
|
270
|
-
return this.visit('/').then(() => {
|
|
271
|
-
let text = this.$('p').text();
|
|
272
|
-
|
|
273
|
-
assert.equal(text, 'emberjs', `Passed model was set as controller's model`);
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
['@test render uses templateName from route'](assert) {
|
|
278
|
-
this.addTemplate('the_real_home_template', '<p>THIS IS THE REAL HOME</p>');
|
|
279
|
-
this.add(
|
|
280
|
-
'route:home',
|
|
281
|
-
Route.extend({
|
|
282
|
-
templateName: 'the_real_home_template',
|
|
283
|
-
})
|
|
284
|
-
);
|
|
285
|
-
|
|
286
|
-
return this.visit('/').then(() => {
|
|
287
|
-
let text = this.$('p').text();
|
|
288
|
-
|
|
289
|
-
assert.equal(text, 'THIS IS THE REAL HOME', 'the homepage template was rendered');
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
['@test defining templateName allows other templates to be rendered'](assert) {
|
|
294
|
-
this.addTemplate('alert', `<div class='alert-box'>Invader!</div>`);
|
|
295
|
-
this.addTemplate('the_real_home_template', `<p>THIS IS THE REAL HOME</p>{{outlet 'alert'}}`);
|
|
296
|
-
this.add(
|
|
297
|
-
'route:home',
|
|
298
|
-
Route.extend({
|
|
299
|
-
templateName: 'the_real_home_template',
|
|
300
|
-
actions: {
|
|
301
|
-
showAlert() {
|
|
302
|
-
this.render('alert', {
|
|
303
|
-
into: 'home',
|
|
304
|
-
outlet: 'alert',
|
|
305
|
-
});
|
|
306
|
-
},
|
|
307
|
-
},
|
|
308
|
-
})
|
|
309
|
-
);
|
|
310
|
-
|
|
311
|
-
return this.visit('/')
|
|
312
|
-
.then(() => {
|
|
313
|
-
let text = this.$('p').text();
|
|
314
|
-
assert.equal(text, 'THIS IS THE REAL HOME', 'the homepage template was rendered');
|
|
315
|
-
|
|
316
|
-
return this.runTask(() => this.appRouter.send('showAlert'));
|
|
317
|
-
})
|
|
318
|
-
.then(() => {
|
|
319
|
-
let text = this.$('.alert-box').text();
|
|
320
|
-
|
|
321
|
-
assert.equal(text, 'Invader!', 'Template for alert was rendered into the outlet');
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
['@test templateName is still used when calling render with no name and options'](assert) {
|
|
326
|
-
this.addTemplate('alert', `<div class='alert-box'>Invader!</div>`);
|
|
327
|
-
this.addTemplate('home', `<p>THIS IS THE REAL HOME</p>{{outlet 'alert'}}`);
|
|
328
|
-
|
|
329
|
-
this.add(
|
|
330
|
-
'route:home',
|
|
331
|
-
Route.extend({
|
|
332
|
-
templateName: 'alert',
|
|
333
|
-
renderTemplate() {
|
|
334
|
-
this.render({});
|
|
335
|
-
},
|
|
336
|
-
})
|
|
337
|
-
);
|
|
338
|
-
|
|
339
|
-
return this.visit('/').then(() => {
|
|
340
|
-
let text = this.$('.alert-box').text();
|
|
341
|
-
|
|
342
|
-
assert.equal(text, 'Invader!', 'default templateName was rendered into outlet');
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
['@test The Homepage with a `setupController` hook'](assert) {
|
|
347
|
-
this.addTemplate(
|
|
348
|
-
'home',
|
|
349
|
-
`<ul>{{#each hours as |entry|}}
|
|
350
|
-
<li>{{entry}}</li>
|
|
351
|
-
{{/each}}
|
|
352
|
-
</ul>
|
|
353
|
-
`
|
|
354
|
-
);
|
|
355
|
-
|
|
356
|
-
this.add(
|
|
357
|
-
'route:home',
|
|
358
|
-
Route.extend({
|
|
359
|
-
setupController(controller) {
|
|
360
|
-
controller.set('hours', [
|
|
361
|
-
'Monday through Friday: 9am to 5pm',
|
|
362
|
-
'Saturday: Noon to Midnight',
|
|
363
|
-
'Sunday: Noon to 6pm',
|
|
364
|
-
]);
|
|
365
|
-
},
|
|
366
|
-
})
|
|
367
|
-
);
|
|
368
|
-
return this.visit('/').then(() => {
|
|
369
|
-
let text = this.$('ul li:nth-child(3)').text();
|
|
370
|
-
|
|
371
|
-
assert.equal(
|
|
372
|
-
text,
|
|
373
|
-
'Sunday: Noon to 6pm',
|
|
374
|
-
'The template was rendered with the hours context'
|
|
375
|
-
);
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
[`@test The route controller is still set when overriding the setupController hook`](assert) {
|
|
380
|
-
this.add(
|
|
381
|
-
'route:home',
|
|
382
|
-
Route.extend({
|
|
383
|
-
setupController() {
|
|
384
|
-
// no-op
|
|
385
|
-
// importantly, we are not calling this._super
|
|
386
|
-
},
|
|
387
|
-
})
|
|
388
|
-
);
|
|
389
|
-
|
|
390
|
-
this.add('controller:home', Controller.extend());
|
|
391
|
-
|
|
392
|
-
return this.visit('/').then(() => {
|
|
393
|
-
let homeRoute = this.applicationInstance.lookup('route:home');
|
|
394
|
-
let homeController = this.applicationInstance.lookup('controller:home');
|
|
395
|
-
|
|
396
|
-
assert.equal(
|
|
397
|
-
homeRoute.controller,
|
|
398
|
-
homeController,
|
|
399
|
-
'route controller is the home controller'
|
|
400
|
-
);
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
['@test the route controller can be specified via controllerName'](assert) {
|
|
405
|
-
this.addTemplate('home', '<p>{{myValue}}</p>');
|
|
406
|
-
this.add(
|
|
407
|
-
'route:home',
|
|
408
|
-
Route.extend({
|
|
409
|
-
controllerName: 'myController',
|
|
410
|
-
})
|
|
411
|
-
);
|
|
412
|
-
this.add(
|
|
413
|
-
'controller:myController',
|
|
414
|
-
Controller.extend({
|
|
415
|
-
myValue: 'foo',
|
|
416
|
-
})
|
|
417
|
-
);
|
|
418
|
-
|
|
419
|
-
return this.visit('/').then(() => {
|
|
420
|
-
let homeRoute = this.applicationInstance.lookup('route:home');
|
|
421
|
-
let myController = this.applicationInstance.lookup('controller:myController');
|
|
422
|
-
let text = this.$('p').text();
|
|
423
|
-
|
|
424
|
-
assert.equal(
|
|
425
|
-
homeRoute.controller,
|
|
426
|
-
myController,
|
|
427
|
-
'route controller is set by controllerName'
|
|
428
|
-
);
|
|
429
|
-
assert.equal(
|
|
430
|
-
text,
|
|
431
|
-
'foo',
|
|
432
|
-
'The homepage template was rendered with data from the custom controller'
|
|
433
|
-
);
|
|
434
|
-
});
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
[`@test The route controller specified via controllerName is used in render`](assert) {
|
|
438
|
-
this.router.map(function() {
|
|
439
|
-
this.route('home', { path: '/' });
|
|
440
|
-
});
|
|
441
|
-
|
|
442
|
-
this.add(
|
|
443
|
-
'route:home',
|
|
444
|
-
Route.extend({
|
|
445
|
-
controllerName: 'myController',
|
|
446
|
-
renderTemplate() {
|
|
447
|
-
this.render('alternative_home');
|
|
448
|
-
},
|
|
449
|
-
})
|
|
450
|
-
);
|
|
451
|
-
|
|
452
|
-
this.add(
|
|
453
|
-
'controller:myController',
|
|
454
|
-
Controller.extend({
|
|
455
|
-
myValue: 'foo',
|
|
456
|
-
})
|
|
457
|
-
);
|
|
458
|
-
|
|
459
|
-
this.addTemplate('alternative_home', '<p>alternative home: {{myValue}}</p>');
|
|
460
|
-
|
|
461
|
-
return this.visit('/').then(() => {
|
|
462
|
-
let homeRoute = this.applicationInstance.lookup('route:home');
|
|
463
|
-
let myController = this.applicationInstance.lookup('controller:myController');
|
|
464
|
-
let text = this.$('p').text();
|
|
465
|
-
|
|
466
|
-
assert.equal(
|
|
467
|
-
homeRoute.controller,
|
|
468
|
-
myController,
|
|
469
|
-
'route controller is set by controllerName'
|
|
470
|
-
);
|
|
471
|
-
|
|
472
|
-
assert.equal(
|
|
473
|
-
text,
|
|
474
|
-
'alternative home: foo',
|
|
475
|
-
'The homepage template was rendered with data from the custom controller'
|
|
476
|
-
);
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
[`@test The route controller specified via controllerName is used in render even when a controller with the routeName is available`](
|
|
481
|
-
assert
|
|
482
|
-
) {
|
|
483
|
-
this.router.map(function() {
|
|
484
|
-
this.route('home', { path: '/' });
|
|
485
|
-
});
|
|
486
|
-
|
|
487
|
-
this.addTemplate('home', '<p>home: {{myValue}}</p>');
|
|
488
|
-
|
|
489
|
-
this.add(
|
|
490
|
-
'route:home',
|
|
491
|
-
Route.extend({
|
|
492
|
-
controllerName: 'myController',
|
|
493
|
-
})
|
|
494
|
-
);
|
|
495
|
-
|
|
496
|
-
this.add(
|
|
497
|
-
'controller:home',
|
|
498
|
-
Controller.extend({
|
|
499
|
-
myValue: 'home',
|
|
500
|
-
})
|
|
501
|
-
);
|
|
502
|
-
|
|
503
|
-
this.add(
|
|
504
|
-
'controller:myController',
|
|
505
|
-
Controller.extend({
|
|
506
|
-
myValue: 'myController',
|
|
507
|
-
})
|
|
508
|
-
);
|
|
509
|
-
|
|
510
|
-
return this.visit('/').then(() => {
|
|
511
|
-
let homeRoute = this.applicationInstance.lookup('route:home');
|
|
512
|
-
let myController = this.applicationInstance.lookup('controller:myController');
|
|
513
|
-
let text = this.$('p').text();
|
|
514
|
-
|
|
515
|
-
assert.equal(
|
|
516
|
-
homeRoute.controller,
|
|
517
|
-
myController,
|
|
518
|
-
'route controller is set by controllerName'
|
|
519
|
-
);
|
|
520
|
-
|
|
521
|
-
assert.equal(
|
|
522
|
-
text,
|
|
523
|
-
'home: myController',
|
|
524
|
-
'The homepage template was rendered with data from the custom controller'
|
|
525
|
-
);
|
|
526
|
-
});
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
[`@test The Homepage with a 'setupController' hook modifying other controllers`](assert) {
|
|
530
|
-
this.router.map(function() {
|
|
531
|
-
this.route('home', { path: '/' });
|
|
532
|
-
});
|
|
533
|
-
|
|
534
|
-
this.add(
|
|
535
|
-
'route:home',
|
|
536
|
-
Route.extend({
|
|
537
|
-
setupController(/* controller */) {
|
|
538
|
-
this.controllerFor('home').set('hours', [
|
|
539
|
-
'Monday through Friday: 9am to 5pm',
|
|
540
|
-
'Saturday: Noon to Midnight',
|
|
541
|
-
'Sunday: Noon to 6pm',
|
|
542
|
-
]);
|
|
543
|
-
},
|
|
544
|
-
})
|
|
545
|
-
);
|
|
546
|
-
|
|
547
|
-
this.addTemplate('home', '<ul>{{#each hours as |entry|}}<li>{{entry}}</li>{{/each}}</ul>');
|
|
548
|
-
|
|
549
|
-
return this.visit('/').then(() => {
|
|
550
|
-
let text = this.$('ul li:nth-child(3)').text();
|
|
551
|
-
|
|
552
|
-
assert.equal(
|
|
553
|
-
text,
|
|
554
|
-
'Sunday: Noon to 6pm',
|
|
555
|
-
'The template was rendered with the hours context'
|
|
556
|
-
);
|
|
557
|
-
});
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
[`@test The Homepage with a computed model that does not get overridden`](assert) {
|
|
561
|
-
this.router.map(function() {
|
|
562
|
-
this.route('home', { path: '/' });
|
|
563
|
-
});
|
|
564
|
-
|
|
565
|
-
this.add(
|
|
566
|
-
'controller:home',
|
|
567
|
-
Controller.extend({
|
|
568
|
-
model: computed(function() {
|
|
569
|
-
return [
|
|
570
|
-
'Monday through Friday: 9am to 5pm',
|
|
571
|
-
'Saturday: Noon to Midnight',
|
|
572
|
-
'Sunday: Noon to 6pm',
|
|
573
|
-
];
|
|
574
|
-
}),
|
|
575
|
-
})
|
|
576
|
-
);
|
|
577
|
-
|
|
578
|
-
this.addTemplate(
|
|
579
|
-
'home',
|
|
580
|
-
'<ul>{{#each model as |passage|}}<li>{{passage}}</li>{{/each}}</ul>'
|
|
581
|
-
);
|
|
582
|
-
|
|
583
|
-
return this.visit('/').then(() => {
|
|
584
|
-
let text = this.$('ul li:nth-child(3)').text();
|
|
585
|
-
|
|
586
|
-
assert.equal(
|
|
587
|
-
text,
|
|
588
|
-
'Sunday: Noon to 6pm',
|
|
589
|
-
'The template was rendered with the context intact'
|
|
590
|
-
);
|
|
591
|
-
});
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
[`@test The Homepage getting its controller context via model`](assert) {
|
|
595
|
-
this.router.map(function() {
|
|
596
|
-
this.route('home', { path: '/' });
|
|
597
|
-
});
|
|
598
|
-
|
|
599
|
-
this.add(
|
|
600
|
-
'route:home',
|
|
601
|
-
Route.extend({
|
|
602
|
-
model() {
|
|
603
|
-
return [
|
|
604
|
-
'Monday through Friday: 9am to 5pm',
|
|
605
|
-
'Saturday: Noon to Midnight',
|
|
606
|
-
'Sunday: Noon to 6pm',
|
|
607
|
-
];
|
|
608
|
-
},
|
|
609
|
-
|
|
610
|
-
setupController(controller, model) {
|
|
611
|
-
assert.equal(this.controllerFor('home'), controller);
|
|
612
|
-
|
|
613
|
-
this.controllerFor('home').set('hours', model);
|
|
614
|
-
},
|
|
615
|
-
})
|
|
616
|
-
);
|
|
617
|
-
|
|
618
|
-
this.addTemplate('home', '<ul>{{#each hours as |entry|}}<li>{{entry}}</li>{{/each}}</ul>');
|
|
619
|
-
|
|
620
|
-
return this.visit('/').then(() => {
|
|
621
|
-
let text = this.$('ul li:nth-child(3)').text();
|
|
622
|
-
|
|
623
|
-
assert.equal(
|
|
624
|
-
text,
|
|
625
|
-
'Sunday: Noon to 6pm',
|
|
626
|
-
'The template was rendered with the hours context'
|
|
627
|
-
);
|
|
628
|
-
});
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
[`@test The Specials Page getting its controller context by deserializing the params hash`](
|
|
632
|
-
assert
|
|
633
|
-
) {
|
|
634
|
-
this.router.map(function() {
|
|
635
|
-
this.route('home', { path: '/' });
|
|
636
|
-
this.route('special', { path: '/specials/:menu_item_id' });
|
|
637
|
-
});
|
|
638
|
-
|
|
639
|
-
this.add(
|
|
640
|
-
'route:special',
|
|
641
|
-
Route.extend({
|
|
642
|
-
model(params) {
|
|
643
|
-
return EmberObject.create({
|
|
644
|
-
menuItemId: params.menu_item_id,
|
|
645
|
-
});
|
|
646
|
-
},
|
|
647
|
-
})
|
|
648
|
-
);
|
|
649
|
-
|
|
650
|
-
this.addTemplate('special', '<p>{{model.menuItemId}}</p>');
|
|
651
|
-
|
|
652
|
-
return this.visit('/specials/1').then(() => {
|
|
653
|
-
let text = this.$('p').text();
|
|
654
|
-
|
|
655
|
-
assert.equal(text, '1', 'The model was used to render the template');
|
|
656
|
-
});
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
['@test The Specials Page defaults to looking models up via `find`']() {
|
|
660
|
-
let MenuItem = EmberObject.extend();
|
|
661
|
-
MenuItem.reopenClass({
|
|
662
|
-
find(id) {
|
|
663
|
-
return MenuItem.create({ id });
|
|
664
|
-
},
|
|
665
|
-
});
|
|
666
|
-
this.add('model:menu_item', MenuItem);
|
|
667
|
-
|
|
668
|
-
this.router.map(function() {
|
|
669
|
-
this.route('home', { path: '/' });
|
|
670
|
-
this.route('special', { path: '/specials/:menu_item_id' });
|
|
671
|
-
});
|
|
672
|
-
|
|
673
|
-
this.addTemplate('special', '{{model.id}}');
|
|
674
|
-
|
|
675
|
-
return this.visit('/specials/1').then(() => {
|
|
676
|
-
this.assertText('1', 'The model was used to render the template');
|
|
677
|
-
});
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
['@test The Special Page returning a promise puts the app into a loading state until the promise is resolved']() {
|
|
681
|
-
this.router.map(function() {
|
|
682
|
-
this.route('home', { path: '/' });
|
|
683
|
-
this.route('special', { path: '/specials/:menu_item_id' });
|
|
684
|
-
});
|
|
685
|
-
|
|
686
|
-
let menuItem, resolve;
|
|
687
|
-
|
|
688
|
-
let MenuItem = EmberObject.extend();
|
|
689
|
-
MenuItem.reopenClass({
|
|
690
|
-
find(id) {
|
|
691
|
-
menuItem = MenuItem.create({ id: id });
|
|
692
|
-
|
|
693
|
-
return new RSVP.Promise(function(res) {
|
|
694
|
-
resolve = res;
|
|
695
|
-
});
|
|
696
|
-
},
|
|
697
|
-
});
|
|
698
|
-
|
|
699
|
-
this.add('model:menu_item', MenuItem);
|
|
700
|
-
|
|
701
|
-
this.addTemplate('special', '<p>{{model.id}}</p>');
|
|
702
|
-
this.addTemplate('loading', '<p>LOADING!</p>');
|
|
703
|
-
|
|
704
|
-
let visited = this.visit('/specials/1');
|
|
705
|
-
this.assertText('LOADING!', 'The app is in the loading state');
|
|
706
|
-
|
|
707
|
-
resolve(menuItem);
|
|
708
|
-
|
|
709
|
-
return visited.then(() => {
|
|
710
|
-
this.assertText('1', 'The app is now in the specials state');
|
|
711
|
-
});
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
[`@test The loading state doesn't get entered for promises that resolve on the same run loop`](
|
|
715
|
-
assert
|
|
716
|
-
) {
|
|
717
|
-
this.router.map(function() {
|
|
718
|
-
this.route('home', { path: '/' });
|
|
719
|
-
this.route('special', { path: '/specials/:menu_item_id' });
|
|
720
|
-
});
|
|
721
|
-
|
|
722
|
-
let MenuItem = EmberObject.extend();
|
|
723
|
-
MenuItem.reopenClass({
|
|
724
|
-
find(id) {
|
|
725
|
-
return { id: id };
|
|
726
|
-
},
|
|
727
|
-
});
|
|
728
|
-
|
|
729
|
-
this.add('model:menu_item', MenuItem);
|
|
730
|
-
|
|
731
|
-
this.add(
|
|
732
|
-
'route:loading',
|
|
733
|
-
Route.extend({
|
|
734
|
-
enter() {
|
|
735
|
-
assert.ok(false, "LoadingRoute shouldn't have been entered.");
|
|
736
|
-
},
|
|
737
|
-
})
|
|
738
|
-
);
|
|
739
|
-
|
|
740
|
-
this.addTemplate('special', '<p>{{model.id}}</p>');
|
|
741
|
-
this.addTemplate('loading', '<p>LOADING!</p>');
|
|
742
|
-
|
|
743
|
-
return this.visit('/specials/1').then(() => {
|
|
744
|
-
let text = this.$('p').text();
|
|
745
|
-
|
|
746
|
-
assert.equal(text, '1', 'The app is now in the specials state');
|
|
747
|
-
});
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
["@test The Special page returning an error invokes SpecialRoute's error handler"](assert) {
|
|
751
|
-
this.router.map(function() {
|
|
752
|
-
this.route('home', { path: '/' });
|
|
753
|
-
this.route('special', { path: '/specials/:menu_item_id' });
|
|
754
|
-
});
|
|
755
|
-
|
|
756
|
-
let menuItem, promise, resolve;
|
|
757
|
-
|
|
758
|
-
let MenuItem = EmberObject.extend();
|
|
759
|
-
MenuItem.reopenClass({
|
|
760
|
-
find(id) {
|
|
761
|
-
menuItem = MenuItem.create({ id: id });
|
|
762
|
-
promise = new RSVP.Promise(res => (resolve = res));
|
|
763
|
-
|
|
764
|
-
return promise;
|
|
765
|
-
},
|
|
766
|
-
});
|
|
767
|
-
|
|
768
|
-
this.add('model:menu_item', MenuItem);
|
|
769
|
-
|
|
770
|
-
this.add(
|
|
771
|
-
'route:special',
|
|
772
|
-
Route.extend({
|
|
773
|
-
setup() {
|
|
774
|
-
throw 'Setup error';
|
|
775
|
-
},
|
|
776
|
-
actions: {
|
|
777
|
-
error(reason) {
|
|
778
|
-
assert.equal(
|
|
779
|
-
reason,
|
|
780
|
-
'Setup error',
|
|
781
|
-
'SpecialRoute#error received the error thrown from setup'
|
|
782
|
-
);
|
|
783
|
-
return true;
|
|
784
|
-
},
|
|
785
|
-
},
|
|
786
|
-
})
|
|
787
|
-
);
|
|
788
|
-
|
|
789
|
-
this.handleURLRejectsWith(this, assert, 'specials/1', 'Setup error');
|
|
790
|
-
|
|
791
|
-
run(() => resolve(menuItem));
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
["@test ApplicationRoute's default error handler can be overridden"](assert) {
|
|
795
|
-
assert.expect(2);
|
|
796
|
-
|
|
797
|
-
this.router.map(function() {
|
|
798
|
-
this.route('home', { path: '/' });
|
|
799
|
-
this.route('special', { path: '/specials/:menu_item_id' });
|
|
800
|
-
});
|
|
801
|
-
|
|
802
|
-
let menuItem, resolve;
|
|
803
|
-
|
|
804
|
-
let MenuItem = EmberObject.extend();
|
|
805
|
-
|
|
806
|
-
MenuItem.reopenClass({
|
|
807
|
-
find(id) {
|
|
808
|
-
menuItem = MenuItem.create({ id: id });
|
|
809
|
-
return new RSVP.Promise(res => (resolve = res));
|
|
810
|
-
},
|
|
811
|
-
});
|
|
812
|
-
this.add('model:menu_item', MenuItem);
|
|
813
|
-
|
|
814
|
-
this.add(
|
|
815
|
-
'route:application',
|
|
816
|
-
Route.extend({
|
|
817
|
-
actions: {
|
|
818
|
-
error(reason) {
|
|
819
|
-
assert.equal(
|
|
820
|
-
reason,
|
|
821
|
-
'Setup error',
|
|
822
|
-
'error was correctly passed to custom ApplicationRoute handler'
|
|
823
|
-
);
|
|
824
|
-
return true;
|
|
825
|
-
},
|
|
826
|
-
},
|
|
827
|
-
})
|
|
828
|
-
);
|
|
829
|
-
|
|
830
|
-
this.add(
|
|
831
|
-
'route:special',
|
|
832
|
-
Route.extend({
|
|
833
|
-
setup() {
|
|
834
|
-
throw 'Setup error';
|
|
835
|
-
},
|
|
836
|
-
})
|
|
837
|
-
);
|
|
838
|
-
|
|
839
|
-
this.handleURLRejectsWith(this, assert, '/specials/1', 'Setup error');
|
|
840
|
-
|
|
841
|
-
run(() => resolve(menuItem));
|
|
842
|
-
}
|
|
843
|
-
|
|
844
|
-
['@test Moving from one page to another triggers the correct callbacks'](assert) {
|
|
845
|
-
assert.expect(3);
|
|
846
|
-
|
|
847
|
-
this.router.map(function() {
|
|
848
|
-
this.route('home', { path: '/' });
|
|
849
|
-
this.route('special', { path: '/specials/:menu_item_id' });
|
|
850
|
-
});
|
|
851
|
-
|
|
852
|
-
let MenuItem = EmberObject.extend();
|
|
853
|
-
MenuItem.reopenClass({
|
|
854
|
-
find(id) {
|
|
855
|
-
return MenuItem.create({ id: id });
|
|
856
|
-
},
|
|
857
|
-
});
|
|
858
|
-
this.add('model:menu_item', MenuItem);
|
|
859
|
-
|
|
860
|
-
this.addTemplate('home', '<h3>Home</h3>');
|
|
861
|
-
this.addTemplate('special', '<p>{{model.id}}</p>');
|
|
862
|
-
|
|
863
|
-
return this.visit('/')
|
|
864
|
-
.then(() => {
|
|
865
|
-
this.assertText('Home', 'The app is now in the initial state');
|
|
866
|
-
|
|
867
|
-
let promiseContext = MenuItem.create({ id: 1 });
|
|
868
|
-
|
|
869
|
-
return this.visit('/specials/1', promiseContext);
|
|
870
|
-
})
|
|
871
|
-
.then(() => {
|
|
872
|
-
assert.equal(this.currentURL, '/specials/1');
|
|
873
|
-
this.assertText('1', 'The app is now transitioned');
|
|
874
|
-
});
|
|
875
|
-
}
|
|
876
|
-
|
|
877
|
-
['@test Nested callbacks are not exited when moving to siblings'](assert) {
|
|
878
|
-
let rootSetup = 0;
|
|
879
|
-
let rootRender = 0;
|
|
880
|
-
let rootModel = 0;
|
|
881
|
-
let rootSerialize = 0;
|
|
882
|
-
let menuItem;
|
|
883
|
-
let rootElement;
|
|
884
|
-
|
|
885
|
-
let MenuItem = EmberObject.extend();
|
|
886
|
-
MenuItem.reopenClass({
|
|
887
|
-
find(id) {
|
|
888
|
-
menuItem = MenuItem.create({ id: id });
|
|
889
|
-
return menuItem;
|
|
890
|
-
},
|
|
891
|
-
});
|
|
892
|
-
|
|
893
|
-
this.router.map(function() {
|
|
894
|
-
this.route('root', { path: '/' }, function() {
|
|
895
|
-
this.route('special', {
|
|
896
|
-
path: '/specials/:menu_item_id',
|
|
897
|
-
resetNamespace: true,
|
|
898
|
-
});
|
|
899
|
-
});
|
|
900
|
-
});
|
|
901
|
-
|
|
902
|
-
this.add(
|
|
903
|
-
'route:root',
|
|
904
|
-
Route.extend({
|
|
905
|
-
model() {
|
|
906
|
-
rootModel++;
|
|
907
|
-
return this._super(...arguments);
|
|
908
|
-
},
|
|
909
|
-
|
|
910
|
-
setupController() {
|
|
911
|
-
rootSetup++;
|
|
912
|
-
},
|
|
913
|
-
|
|
914
|
-
renderTemplate() {
|
|
915
|
-
rootRender++;
|
|
916
|
-
},
|
|
917
|
-
|
|
918
|
-
serialize() {
|
|
919
|
-
rootSerialize++;
|
|
920
|
-
return this._super(...arguments);
|
|
921
|
-
},
|
|
922
|
-
})
|
|
923
|
-
);
|
|
924
|
-
|
|
925
|
-
this.add('route:loading', Route.extend({}));
|
|
926
|
-
this.add('route:home', Route.extend({}));
|
|
927
|
-
this.add(
|
|
928
|
-
'route:special',
|
|
929
|
-
Route.extend({
|
|
930
|
-
model({ menu_item_id }) {
|
|
931
|
-
return MenuItem.find(menu_item_id);
|
|
932
|
-
},
|
|
933
|
-
setupController(controller, model) {
|
|
934
|
-
set(controller, 'model', model);
|
|
935
|
-
},
|
|
936
|
-
})
|
|
937
|
-
);
|
|
938
|
-
|
|
939
|
-
this.addTemplate('root.index', '<h3>Home</h3>');
|
|
940
|
-
this.addTemplate('special', '<p>{{model.id}}</p>');
|
|
941
|
-
this.addTemplate('loading', '<p>LOADING!</p>');
|
|
942
|
-
|
|
943
|
-
return this.visit('/').then(() => {
|
|
944
|
-
rootElement = document.getElementById('qunit-fixture');
|
|
945
|
-
|
|
946
|
-
assert.equal(
|
|
947
|
-
getTextOf(rootElement.querySelector('h3')),
|
|
948
|
-
'Home',
|
|
949
|
-
'The app is now in the initial state'
|
|
950
|
-
);
|
|
951
|
-
assert.equal(rootSetup, 1, 'The root setup was triggered');
|
|
952
|
-
assert.equal(rootRender, 1, 'The root render was triggered');
|
|
953
|
-
assert.equal(rootSerialize, 0, 'The root serialize was not called');
|
|
954
|
-
assert.equal(rootModel, 1, 'The root model was called');
|
|
955
|
-
|
|
956
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
957
|
-
let menuItem = MenuItem.create({ id: 1 });
|
|
958
|
-
|
|
959
|
-
return router.transitionTo('special', menuItem).then(function() {
|
|
960
|
-
assert.equal(rootSetup, 1, 'The root setup was not triggered again');
|
|
961
|
-
assert.equal(rootRender, 1, 'The root render was not triggered again');
|
|
962
|
-
assert.equal(rootSerialize, 0, 'The root serialize was not called');
|
|
963
|
-
|
|
964
|
-
// TODO: Should this be changed?
|
|
965
|
-
assert.equal(rootModel, 1, 'The root model was called again');
|
|
966
|
-
|
|
967
|
-
assert.deepEqual(router.location.path, '/specials/1');
|
|
968
|
-
assert.equal(router.currentPath, 'root.special');
|
|
969
|
-
});
|
|
970
|
-
});
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
['@test Events are triggered on the controller if a matching action name is implemented'](
|
|
974
|
-
assert
|
|
975
|
-
) {
|
|
976
|
-
let done = assert.async();
|
|
977
|
-
|
|
978
|
-
this.router.map(function() {
|
|
979
|
-
this.route('home', { path: '/' });
|
|
980
|
-
});
|
|
981
|
-
|
|
982
|
-
let model = { name: 'Tom Dale' };
|
|
983
|
-
let stateIsNotCalled = true;
|
|
984
|
-
|
|
985
|
-
this.add(
|
|
986
|
-
'route:home',
|
|
987
|
-
Route.extend({
|
|
988
|
-
model() {
|
|
989
|
-
return model;
|
|
990
|
-
},
|
|
991
|
-
|
|
992
|
-
actions: {
|
|
993
|
-
showStuff() {
|
|
994
|
-
stateIsNotCalled = false;
|
|
995
|
-
},
|
|
996
|
-
},
|
|
997
|
-
})
|
|
998
|
-
);
|
|
999
|
-
|
|
1000
|
-
this.addTemplate('home', '<a {{action "showStuff" model}}>{{name}}</a>');
|
|
1001
|
-
this.add(
|
|
1002
|
-
'controller:home',
|
|
1003
|
-
Controller.extend({
|
|
1004
|
-
actions: {
|
|
1005
|
-
showStuff(context) {
|
|
1006
|
-
assert.ok(stateIsNotCalled, 'an event on the state is not triggered');
|
|
1007
|
-
assert.deepEqual(context, { name: 'Tom Dale' }, 'an event with context is passed');
|
|
1008
|
-
done();
|
|
1009
|
-
},
|
|
1010
|
-
},
|
|
1011
|
-
})
|
|
1012
|
-
);
|
|
1013
|
-
|
|
1014
|
-
this.visit('/').then(() => {
|
|
1015
|
-
document
|
|
1016
|
-
.getElementById('qunit-fixture')
|
|
1017
|
-
.querySelector('a')
|
|
1018
|
-
.click();
|
|
1019
|
-
});
|
|
1020
|
-
}
|
|
1021
|
-
|
|
1022
|
-
['@test Events are triggered on the current state when defined in `actions` object'](assert) {
|
|
1023
|
-
let done = assert.async();
|
|
1024
|
-
|
|
1025
|
-
this.router.map(function() {
|
|
1026
|
-
this.route('home', { path: '/' });
|
|
1027
|
-
});
|
|
1028
|
-
|
|
1029
|
-
let model = { name: 'Tom Dale' };
|
|
1030
|
-
let HomeRoute = Route.extend({
|
|
1031
|
-
model() {
|
|
1032
|
-
return model;
|
|
1033
|
-
},
|
|
1034
|
-
|
|
1035
|
-
actions: {
|
|
1036
|
-
showStuff(obj) {
|
|
1037
|
-
assert.ok(this instanceof HomeRoute, 'the handler is an App.HomeRoute');
|
|
1038
|
-
assert.deepEqual(
|
|
1039
|
-
Object.assign({}, obj),
|
|
1040
|
-
{ name: 'Tom Dale' },
|
|
1041
|
-
'the context is correct'
|
|
1042
|
-
);
|
|
1043
|
-
done();
|
|
1044
|
-
},
|
|
1045
|
-
},
|
|
1046
|
-
});
|
|
1047
|
-
|
|
1048
|
-
this.add('route:home', HomeRoute);
|
|
1049
|
-
this.addTemplate('home', '<a {{action "showStuff" model}}>{{model.name}}</a>');
|
|
1050
|
-
|
|
1051
|
-
this.visit('/').then(() => {
|
|
1052
|
-
document
|
|
1053
|
-
.getElementById('qunit-fixture')
|
|
1054
|
-
.querySelector('a')
|
|
1055
|
-
.click();
|
|
1056
|
-
});
|
|
1057
|
-
}
|
|
1058
|
-
|
|
1059
|
-
['@test Events defined in `actions` object are triggered on the current state when routes are nested'](
|
|
1060
|
-
assert
|
|
1061
|
-
) {
|
|
1062
|
-
let done = assert.async();
|
|
1063
|
-
|
|
1064
|
-
this.router.map(function() {
|
|
1065
|
-
this.route('root', { path: '/' }, function() {
|
|
1066
|
-
this.route('index', { path: '/' });
|
|
1067
|
-
});
|
|
1068
|
-
});
|
|
1069
|
-
|
|
1070
|
-
let model = { name: 'Tom Dale' };
|
|
1071
|
-
|
|
1072
|
-
let RootRoute = Route.extend({
|
|
1073
|
-
actions: {
|
|
1074
|
-
showStuff(obj) {
|
|
1075
|
-
assert.ok(this instanceof RootRoute, 'the handler is an App.HomeRoute');
|
|
1076
|
-
assert.deepEqual(
|
|
1077
|
-
Object.assign({}, obj),
|
|
1078
|
-
{ name: 'Tom Dale' },
|
|
1079
|
-
'the context is correct'
|
|
1080
|
-
);
|
|
1081
|
-
done();
|
|
1082
|
-
},
|
|
1083
|
-
},
|
|
1084
|
-
});
|
|
1085
|
-
this.add('route:root', RootRoute);
|
|
1086
|
-
this.add(
|
|
1087
|
-
'route:root.index',
|
|
1088
|
-
Route.extend({
|
|
1089
|
-
model() {
|
|
1090
|
-
return model;
|
|
1091
|
-
},
|
|
1092
|
-
})
|
|
1093
|
-
);
|
|
1094
|
-
|
|
1095
|
-
this.addTemplate('root.index', '<a {{action "showStuff" model}}>{{model.name}}</a>');
|
|
1096
|
-
|
|
1097
|
-
this.visit('/').then(() => {
|
|
1098
|
-
document
|
|
1099
|
-
.getElementById('qunit-fixture')
|
|
1100
|
-
.querySelector('a')
|
|
1101
|
-
.click();
|
|
1102
|
-
});
|
|
1103
|
-
}
|
|
1104
|
-
|
|
1105
|
-
['@test Events can be handled by inherited event handlers'](assert) {
|
|
1106
|
-
assert.expect(4);
|
|
1107
|
-
|
|
1108
|
-
let SuperRoute = Route.extend({
|
|
1109
|
-
actions: {
|
|
1110
|
-
foo() {
|
|
1111
|
-
assert.ok(true, 'foo');
|
|
1112
|
-
},
|
|
1113
|
-
bar(msg) {
|
|
1114
|
-
assert.equal(msg, 'HELLO', 'bar hander in super route');
|
|
1115
|
-
},
|
|
1116
|
-
},
|
|
1117
|
-
});
|
|
1118
|
-
|
|
1119
|
-
let RouteMixin = Mixin.create({
|
|
1120
|
-
actions: {
|
|
1121
|
-
bar(msg) {
|
|
1122
|
-
assert.equal(msg, 'HELLO', 'bar handler in mixin');
|
|
1123
|
-
this._super(msg);
|
|
1124
|
-
},
|
|
1125
|
-
},
|
|
1126
|
-
});
|
|
1127
|
-
|
|
1128
|
-
this.add(
|
|
1129
|
-
'route:home',
|
|
1130
|
-
SuperRoute.extend(RouteMixin, {
|
|
1131
|
-
actions: {
|
|
1132
|
-
baz() {
|
|
1133
|
-
assert.ok(true, 'baz', 'baz hander in route');
|
|
1134
|
-
},
|
|
1135
|
-
},
|
|
1136
|
-
})
|
|
1137
|
-
);
|
|
1138
|
-
this.addTemplate(
|
|
1139
|
-
'home',
|
|
1140
|
-
`
|
|
1141
|
-
<a class="do-foo" {{action "foo"}}>Do foo</a>
|
|
1142
|
-
<a class="do-bar-with-arg" {{action "bar" "HELLO"}}>Do bar with arg</a>
|
|
1143
|
-
<a class="do-baz" {{action "baz"}}>Do bar</a>
|
|
1144
|
-
`
|
|
1145
|
-
);
|
|
1146
|
-
|
|
1147
|
-
return this.visit('/').then(() => {
|
|
1148
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
1149
|
-
rootElement.querySelector('.do-foo').click();
|
|
1150
|
-
rootElement.querySelector('.do-bar-with-arg').click();
|
|
1151
|
-
rootElement.querySelector('.do-baz').click();
|
|
1152
|
-
});
|
|
1153
|
-
}
|
|
1154
|
-
|
|
1155
|
-
['@test Actions are not triggered on the controller if a matching action name is implemented as a method'](
|
|
1156
|
-
assert
|
|
1157
|
-
) {
|
|
1158
|
-
let done = assert.async();
|
|
1159
|
-
|
|
1160
|
-
this.router.map(function() {
|
|
1161
|
-
this.route('home', { path: '/' });
|
|
1162
|
-
});
|
|
1163
|
-
|
|
1164
|
-
let model = { name: 'Tom Dale' };
|
|
1165
|
-
let stateIsNotCalled = true;
|
|
1166
|
-
|
|
1167
|
-
this.add(
|
|
1168
|
-
'route:home',
|
|
1169
|
-
Route.extend({
|
|
1170
|
-
model() {
|
|
1171
|
-
return model;
|
|
1172
|
-
},
|
|
1173
|
-
|
|
1174
|
-
actions: {
|
|
1175
|
-
showStuff(context) {
|
|
1176
|
-
assert.ok(stateIsNotCalled, 'an event on the state is not triggered');
|
|
1177
|
-
assert.deepEqual(context, { name: 'Tom Dale' }, 'an event with context is passed');
|
|
1178
|
-
done();
|
|
1179
|
-
},
|
|
1180
|
-
},
|
|
1181
|
-
})
|
|
1182
|
-
);
|
|
1183
|
-
|
|
1184
|
-
this.addTemplate('home', '<a {{action "showStuff" model}}>{{name}}</a>');
|
|
1185
|
-
|
|
1186
|
-
this.add(
|
|
1187
|
-
'controller:home',
|
|
1188
|
-
Controller.extend({
|
|
1189
|
-
showStuff() {
|
|
1190
|
-
stateIsNotCalled = false;
|
|
1191
|
-
assert.ok(stateIsNotCalled, 'an event on the state is not triggered');
|
|
1192
|
-
},
|
|
1193
|
-
})
|
|
1194
|
-
);
|
|
1195
|
-
|
|
1196
|
-
this.visit('/').then(() => {
|
|
1197
|
-
document
|
|
1198
|
-
.getElementById('qunit-fixture')
|
|
1199
|
-
.querySelector('a')
|
|
1200
|
-
.click();
|
|
1201
|
-
});
|
|
1202
|
-
}
|
|
1203
|
-
|
|
1204
|
-
['@test actions can be triggered with multiple arguments'](assert) {
|
|
1205
|
-
let done = assert.async();
|
|
1206
|
-
this.router.map(function() {
|
|
1207
|
-
this.route('root', { path: '/' }, function() {
|
|
1208
|
-
this.route('index', { path: '/' });
|
|
1209
|
-
});
|
|
1210
|
-
});
|
|
1211
|
-
|
|
1212
|
-
let model1 = { name: 'Tilde' };
|
|
1213
|
-
let model2 = { name: 'Tom Dale' };
|
|
1214
|
-
|
|
1215
|
-
let RootRoute = Route.extend({
|
|
1216
|
-
actions: {
|
|
1217
|
-
showStuff(obj1, obj2) {
|
|
1218
|
-
assert.ok(this instanceof RootRoute, 'the handler is an App.HomeRoute');
|
|
1219
|
-
assert.deepEqual(
|
|
1220
|
-
Object.assign({}, obj1),
|
|
1221
|
-
{ name: 'Tilde' },
|
|
1222
|
-
'the first context is correct'
|
|
1223
|
-
);
|
|
1224
|
-
assert.deepEqual(
|
|
1225
|
-
Object.assign({}, obj2),
|
|
1226
|
-
{ name: 'Tom Dale' },
|
|
1227
|
-
'the second context is correct'
|
|
1228
|
-
);
|
|
1229
|
-
done();
|
|
1230
|
-
},
|
|
1231
|
-
},
|
|
1232
|
-
});
|
|
1233
|
-
|
|
1234
|
-
this.add('route:root', RootRoute);
|
|
1235
|
-
|
|
1236
|
-
this.add(
|
|
1237
|
-
'controller:root.index',
|
|
1238
|
-
Controller.extend({
|
|
1239
|
-
model1: model1,
|
|
1240
|
-
model2: model2,
|
|
1241
|
-
})
|
|
1242
|
-
);
|
|
1243
|
-
|
|
1244
|
-
this.addTemplate('root.index', '<a {{action "showStuff" model1 model2}}>{{model1.name}}</a>');
|
|
1245
|
-
|
|
1246
|
-
this.visit('/').then(() => {
|
|
1247
|
-
document
|
|
1248
|
-
.getElementById('qunit-fixture')
|
|
1249
|
-
.querySelector('a')
|
|
1250
|
-
.click();
|
|
1251
|
-
});
|
|
1252
|
-
}
|
|
1253
|
-
|
|
1254
|
-
['@test transitioning multiple times in a single run loop only sets the URL once'](assert) {
|
|
1255
|
-
this.router.map(function() {
|
|
1256
|
-
this.route('root', { path: '/' });
|
|
1257
|
-
this.route('foo');
|
|
1258
|
-
this.route('bar');
|
|
1259
|
-
});
|
|
1260
|
-
|
|
1261
|
-
return this.visit('/').then(() => {
|
|
1262
|
-
let urlSetCount = 0;
|
|
1263
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
1264
|
-
|
|
1265
|
-
router.get('location').setURL = function(path) {
|
|
1266
|
-
urlSetCount++;
|
|
1267
|
-
set(this, 'path', path);
|
|
1268
|
-
};
|
|
1269
|
-
|
|
1270
|
-
assert.equal(urlSetCount, 0);
|
|
1271
|
-
|
|
1272
|
-
run(function() {
|
|
1273
|
-
router.transitionTo('foo');
|
|
1274
|
-
router.transitionTo('bar');
|
|
1275
|
-
});
|
|
1276
|
-
|
|
1277
|
-
assert.equal(urlSetCount, 1);
|
|
1278
|
-
assert.equal(router.get('location').getURL(), '/bar');
|
|
1279
|
-
});
|
|
1280
|
-
}
|
|
1281
|
-
|
|
1282
|
-
['@test navigating away triggers a url property change'](assert) {
|
|
1283
|
-
assert.expect(3);
|
|
1284
|
-
|
|
1285
|
-
this.router.map(function() {
|
|
1286
|
-
this.route('root', { path: '/' });
|
|
1287
|
-
this.route('foo', { path: '/foo' });
|
|
1288
|
-
this.route('bar', { path: '/bar' });
|
|
1289
|
-
});
|
|
1290
|
-
|
|
1291
|
-
return this.visit('/').then(() => {
|
|
1292
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
1293
|
-
|
|
1294
|
-
addObserver(router, 'url', function() {
|
|
1295
|
-
assert.ok(true, 'url change event was fired');
|
|
1296
|
-
});
|
|
1297
|
-
['foo', 'bar', '/foo'].forEach(destination => run(router, 'transitionTo', destination));
|
|
1298
|
-
});
|
|
1299
|
-
}
|
|
1300
|
-
|
|
1301
|
-
['@test using replaceWith calls location.replaceURL if available'](assert) {
|
|
1302
|
-
let setCount = 0;
|
|
1303
|
-
let replaceCount = 0;
|
|
1304
|
-
this.router.reopen({
|
|
1305
|
-
location: NoneLocation.create({
|
|
1306
|
-
setURL(path) {
|
|
1307
|
-
setCount++;
|
|
1308
|
-
set(this, 'path', path);
|
|
1309
|
-
},
|
|
1310
|
-
|
|
1311
|
-
replaceURL(path) {
|
|
1312
|
-
replaceCount++;
|
|
1313
|
-
set(this, 'path', path);
|
|
1314
|
-
},
|
|
1315
|
-
}),
|
|
1316
|
-
});
|
|
1317
|
-
|
|
1318
|
-
this.router.map(function() {
|
|
1319
|
-
this.route('root', { path: '/' });
|
|
1320
|
-
this.route('foo');
|
|
1321
|
-
});
|
|
1322
|
-
|
|
1323
|
-
return this.visit('/').then(() => {
|
|
1324
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
1325
|
-
assert.equal(setCount, 1);
|
|
1326
|
-
assert.equal(replaceCount, 0);
|
|
1327
|
-
|
|
1328
|
-
run(() => router.replaceWith('foo'));
|
|
1329
|
-
|
|
1330
|
-
assert.equal(setCount, 1, 'should not call setURL');
|
|
1331
|
-
assert.equal(replaceCount, 1, 'should call replaceURL once');
|
|
1332
|
-
assert.equal(router.get('location').getURL(), '/foo');
|
|
1333
|
-
});
|
|
1334
|
-
}
|
|
1335
|
-
|
|
1336
|
-
['@test using replaceWith calls setURL if location.replaceURL is not defined'](assert) {
|
|
1337
|
-
let setCount = 0;
|
|
1338
|
-
|
|
1339
|
-
this.router.reopen({
|
|
1340
|
-
location: NoneLocation.create({
|
|
1341
|
-
setURL(path) {
|
|
1342
|
-
setCount++;
|
|
1343
|
-
set(this, 'path', path);
|
|
1344
|
-
},
|
|
1345
|
-
}),
|
|
1346
|
-
});
|
|
1347
|
-
|
|
1348
|
-
this.router.map(function() {
|
|
1349
|
-
this.route('root', { path: '/' });
|
|
1350
|
-
this.route('foo');
|
|
1351
|
-
});
|
|
1352
|
-
|
|
1353
|
-
return this.visit('/').then(() => {
|
|
1354
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
1355
|
-
|
|
1356
|
-
assert.equal(setCount, 1);
|
|
1357
|
-
run(() => router.replaceWith('foo'));
|
|
1358
|
-
assert.equal(setCount, 2, 'should call setURL once');
|
|
1359
|
-
assert.equal(router.get('location').getURL(), '/foo');
|
|
1360
|
-
});
|
|
1361
|
-
}
|
|
1362
|
-
|
|
1363
|
-
['@test Route inherits model from parent route'](assert) {
|
|
1364
|
-
assert.expect(9);
|
|
1365
|
-
|
|
1366
|
-
this.router.map(function() {
|
|
1367
|
-
this.route('the-post', { path: '/posts/:post_id' }, function() {
|
|
1368
|
-
this.route('comments');
|
|
1369
|
-
|
|
1370
|
-
this.route('shares', { path: '/shares/:share_id', resetNamespace: true }, function() {
|
|
1371
|
-
this.route('share');
|
|
1372
|
-
});
|
|
1373
|
-
});
|
|
1374
|
-
});
|
|
1375
|
-
|
|
1376
|
-
let post1 = {};
|
|
1377
|
-
let post2 = {};
|
|
1378
|
-
let post3 = {};
|
|
1379
|
-
let share1 = {};
|
|
1380
|
-
let share2 = {};
|
|
1381
|
-
let share3 = {};
|
|
1382
|
-
|
|
1383
|
-
let posts = {
|
|
1384
|
-
1: post1,
|
|
1385
|
-
2: post2,
|
|
1386
|
-
3: post3,
|
|
1387
|
-
};
|
|
1388
|
-
let shares = {
|
|
1389
|
-
1: share1,
|
|
1390
|
-
2: share2,
|
|
1391
|
-
3: share3,
|
|
1392
|
-
};
|
|
1393
|
-
|
|
1394
|
-
this.add(
|
|
1395
|
-
'route:the-post',
|
|
1396
|
-
Route.extend({
|
|
1397
|
-
model(params) {
|
|
1398
|
-
return posts[params.post_id];
|
|
1399
|
-
},
|
|
1400
|
-
})
|
|
1401
|
-
);
|
|
1402
|
-
|
|
1403
|
-
this.add(
|
|
1404
|
-
'route:the-post.comments',
|
|
1405
|
-
Route.extend({
|
|
1406
|
-
afterModel(post /*, transition */) {
|
|
1407
|
-
let parent_model = this.modelFor('the-post');
|
|
1408
|
-
|
|
1409
|
-
assert.equal(post, parent_model);
|
|
1410
|
-
},
|
|
1411
|
-
})
|
|
1412
|
-
);
|
|
1413
|
-
|
|
1414
|
-
this.add(
|
|
1415
|
-
'route:shares',
|
|
1416
|
-
Route.extend({
|
|
1417
|
-
model(params) {
|
|
1418
|
-
return shares[params.share_id];
|
|
1419
|
-
},
|
|
1420
|
-
})
|
|
1421
|
-
);
|
|
1422
|
-
|
|
1423
|
-
this.add(
|
|
1424
|
-
'route:shares.share',
|
|
1425
|
-
Route.extend({
|
|
1426
|
-
afterModel(share /*, transition */) {
|
|
1427
|
-
let parent_model = this.modelFor('shares');
|
|
1428
|
-
|
|
1429
|
-
assert.equal(share, parent_model);
|
|
1430
|
-
},
|
|
1431
|
-
})
|
|
1432
|
-
);
|
|
1433
|
-
|
|
1434
|
-
return this.visit('/posts/1/comments')
|
|
1435
|
-
.then(() => {
|
|
1436
|
-
assert.ok(true, 'url: /posts/1/comments was handled');
|
|
1437
|
-
return this.visit('/posts/1/shares/1');
|
|
1438
|
-
})
|
|
1439
|
-
.then(() => {
|
|
1440
|
-
assert.ok(true, 'url: /posts/1/shares/1 was handled');
|
|
1441
|
-
return this.visit('/posts/2/comments');
|
|
1442
|
-
})
|
|
1443
|
-
.then(() => {
|
|
1444
|
-
assert.ok(true, 'url: /posts/2/comments was handled');
|
|
1445
|
-
return this.visit('/posts/2/shares/2');
|
|
1446
|
-
})
|
|
1447
|
-
.then(() => {
|
|
1448
|
-
assert.ok(true, 'url: /posts/2/shares/2 was handled');
|
|
1449
|
-
return this.visit('/posts/3/comments');
|
|
1450
|
-
})
|
|
1451
|
-
.then(() => {
|
|
1452
|
-
assert.ok(true, 'url: /posts/3/shares was handled');
|
|
1453
|
-
return this.visit('/posts/3/shares/3');
|
|
1454
|
-
})
|
|
1455
|
-
.then(() => {
|
|
1456
|
-
assert.ok(true, 'url: /posts/3/shares/3 was handled');
|
|
1457
|
-
});
|
|
1458
|
-
}
|
|
1459
|
-
|
|
1460
|
-
['@test Routes with { resetNamespace: true } inherits model from parent route'](assert) {
|
|
1461
|
-
assert.expect(6);
|
|
1462
|
-
|
|
1463
|
-
this.router.map(function() {
|
|
1464
|
-
this.route('the-post', { path: '/posts/:post_id' }, function() {
|
|
1465
|
-
this.route('comments', { resetNamespace: true }, function() {});
|
|
1466
|
-
});
|
|
1467
|
-
});
|
|
1468
|
-
|
|
1469
|
-
let post1 = {};
|
|
1470
|
-
let post2 = {};
|
|
1471
|
-
let post3 = {};
|
|
1472
|
-
|
|
1473
|
-
let posts = {
|
|
1474
|
-
1: post1,
|
|
1475
|
-
2: post2,
|
|
1476
|
-
3: post3,
|
|
1477
|
-
};
|
|
1478
|
-
|
|
1479
|
-
this.add(
|
|
1480
|
-
'route:the-post',
|
|
1481
|
-
Route.extend({
|
|
1482
|
-
model(params) {
|
|
1483
|
-
return posts[params.post_id];
|
|
1484
|
-
},
|
|
1485
|
-
})
|
|
1486
|
-
);
|
|
1487
|
-
|
|
1488
|
-
this.add(
|
|
1489
|
-
'route:comments',
|
|
1490
|
-
Route.extend({
|
|
1491
|
-
afterModel(post /*, transition */) {
|
|
1492
|
-
let parent_model = this.modelFor('the-post');
|
|
1493
|
-
|
|
1494
|
-
assert.equal(post, parent_model);
|
|
1495
|
-
},
|
|
1496
|
-
})
|
|
1497
|
-
);
|
|
1498
|
-
|
|
1499
|
-
return this.visit('/posts/1/comments')
|
|
1500
|
-
.then(() => {
|
|
1501
|
-
assert.ok(true, '/posts/1/comments');
|
|
1502
|
-
return this.visit('/posts/2/comments');
|
|
1503
|
-
})
|
|
1504
|
-
.then(() => {
|
|
1505
|
-
assert.ok(true, '/posts/2/comments');
|
|
1506
|
-
return this.visit('/posts/3/comments');
|
|
1507
|
-
})
|
|
1508
|
-
.then(() => {
|
|
1509
|
-
assert.ok(true, '/posts/3/comments');
|
|
1510
|
-
});
|
|
1511
|
-
}
|
|
1512
|
-
|
|
1513
|
-
['@test It is possible to get the model from a parent route'](assert) {
|
|
1514
|
-
assert.expect(6);
|
|
1515
|
-
|
|
1516
|
-
this.router.map(function() {
|
|
1517
|
-
this.route('the-post', { path: '/posts/:post_id' }, function() {
|
|
1518
|
-
this.route('comments', { resetNamespace: true });
|
|
1519
|
-
});
|
|
1520
|
-
});
|
|
1521
|
-
|
|
1522
|
-
let post1 = {};
|
|
1523
|
-
let post2 = {};
|
|
1524
|
-
let post3 = {};
|
|
1525
|
-
let currentPost;
|
|
1526
|
-
|
|
1527
|
-
let posts = {
|
|
1528
|
-
1: post1,
|
|
1529
|
-
2: post2,
|
|
1530
|
-
3: post3,
|
|
1531
|
-
};
|
|
1532
|
-
|
|
1533
|
-
this.add(
|
|
1534
|
-
'route:the-post',
|
|
1535
|
-
Route.extend({
|
|
1536
|
-
model(params) {
|
|
1537
|
-
return posts[params.post_id];
|
|
1538
|
-
},
|
|
1539
|
-
})
|
|
1540
|
-
);
|
|
1541
|
-
|
|
1542
|
-
this.add(
|
|
1543
|
-
'route:comments',
|
|
1544
|
-
Route.extend({
|
|
1545
|
-
model() {
|
|
1546
|
-
assert.equal(this.modelFor('the-post'), currentPost);
|
|
1547
|
-
},
|
|
1548
|
-
})
|
|
1549
|
-
);
|
|
1550
|
-
|
|
1551
|
-
currentPost = post1;
|
|
1552
|
-
return this.visit('/posts/1/comments')
|
|
1553
|
-
.then(() => {
|
|
1554
|
-
assert.ok(true, '/posts/1/comments has been handled');
|
|
1555
|
-
currentPost = post2;
|
|
1556
|
-
return this.visit('/posts/2/comments');
|
|
1557
|
-
})
|
|
1558
|
-
.then(() => {
|
|
1559
|
-
assert.ok(true, '/posts/2/comments has been handled');
|
|
1560
|
-
currentPost = post3;
|
|
1561
|
-
return this.visit('/posts/3/comments');
|
|
1562
|
-
})
|
|
1563
|
-
.then(() => {
|
|
1564
|
-
assert.ok(true, '/posts/3/comments has been handled');
|
|
1565
|
-
});
|
|
1566
|
-
}
|
|
1567
|
-
|
|
1568
|
-
['@test A redirection hook is provided'](assert) {
|
|
1569
|
-
this.router.map(function() {
|
|
1570
|
-
this.route('choose', { path: '/' });
|
|
1571
|
-
this.route('home');
|
|
1572
|
-
});
|
|
1573
|
-
|
|
1574
|
-
let chooseFollowed = 0;
|
|
1575
|
-
let destination = 'home';
|
|
1576
|
-
|
|
1577
|
-
this.add(
|
|
1578
|
-
'route:choose',
|
|
1579
|
-
Route.extend({
|
|
1580
|
-
redirect() {
|
|
1581
|
-
if (destination) {
|
|
1582
|
-
this.transitionTo(destination);
|
|
1583
|
-
}
|
|
1584
|
-
},
|
|
1585
|
-
|
|
1586
|
-
setupController() {
|
|
1587
|
-
chooseFollowed++;
|
|
1588
|
-
},
|
|
1589
|
-
})
|
|
1590
|
-
);
|
|
1591
|
-
|
|
1592
|
-
return this.visit('/').then(() => {
|
|
1593
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
1594
|
-
assert.equal(
|
|
1595
|
-
chooseFollowed,
|
|
1596
|
-
0,
|
|
1597
|
-
"The choose route wasn't entered since a transition occurred"
|
|
1598
|
-
);
|
|
1599
|
-
assert.equal(
|
|
1600
|
-
rootElement.querySelectorAll('h3.hours').length,
|
|
1601
|
-
1,
|
|
1602
|
-
'The home template was rendered'
|
|
1603
|
-
);
|
|
1604
|
-
assert.equal(
|
|
1605
|
-
this.applicationInstance.lookup('controller:application').get('currentPath'),
|
|
1606
|
-
'home'
|
|
1607
|
-
);
|
|
1608
|
-
});
|
|
1609
|
-
}
|
|
1610
|
-
|
|
1611
|
-
['@test Redirecting from the middle of a route aborts the remainder of the routes'](assert) {
|
|
1612
|
-
assert.expect(3);
|
|
1613
|
-
|
|
1614
|
-
this.router.map(function() {
|
|
1615
|
-
this.route('home');
|
|
1616
|
-
this.route('foo', function() {
|
|
1617
|
-
this.route('bar', { resetNamespace: true }, function() {
|
|
1618
|
-
this.route('baz');
|
|
1619
|
-
});
|
|
1620
|
-
});
|
|
1621
|
-
});
|
|
1622
|
-
|
|
1623
|
-
this.add(
|
|
1624
|
-
'route:bar',
|
|
1625
|
-
Route.extend({
|
|
1626
|
-
redirect() {
|
|
1627
|
-
this.transitionTo('home');
|
|
1628
|
-
},
|
|
1629
|
-
setupController() {
|
|
1630
|
-
assert.ok(false, 'Should transition before setupController');
|
|
1631
|
-
},
|
|
1632
|
-
})
|
|
1633
|
-
);
|
|
1634
|
-
|
|
1635
|
-
this.add(
|
|
1636
|
-
'route:bar-baz',
|
|
1637
|
-
Route.extend({
|
|
1638
|
-
enter() {
|
|
1639
|
-
assert.ok(false, 'Should abort transition getting to next route');
|
|
1640
|
-
},
|
|
1641
|
-
})
|
|
1642
|
-
);
|
|
1643
|
-
|
|
1644
|
-
return this.visit('/').then(() => {
|
|
1645
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
1646
|
-
this.handleURLAborts(assert, '/foo/bar/baz');
|
|
1647
|
-
assert.equal(
|
|
1648
|
-
this.applicationInstance.lookup('controller:application').get('currentPath'),
|
|
1649
|
-
'home'
|
|
1650
|
-
);
|
|
1651
|
-
assert.equal(router.get('location').getURL(), '/home');
|
|
1652
|
-
});
|
|
1653
|
-
}
|
|
1654
|
-
|
|
1655
|
-
['@test Redirecting to the current target in the middle of a route does not abort initial routing'](
|
|
1656
|
-
assert
|
|
1657
|
-
) {
|
|
1658
|
-
assert.expect(5);
|
|
1659
|
-
|
|
1660
|
-
this.router.map(function() {
|
|
1661
|
-
this.route('home');
|
|
1662
|
-
this.route('foo', function() {
|
|
1663
|
-
this.route('bar', { resetNamespace: true }, function() {
|
|
1664
|
-
this.route('baz');
|
|
1665
|
-
});
|
|
1666
|
-
});
|
|
1667
|
-
});
|
|
1668
|
-
|
|
1669
|
-
let successCount = 0;
|
|
1670
|
-
|
|
1671
|
-
this.add(
|
|
1672
|
-
'route:bar',
|
|
1673
|
-
Route.extend({
|
|
1674
|
-
redirect() {
|
|
1675
|
-
return this.transitionTo('bar.baz').then(function() {
|
|
1676
|
-
successCount++;
|
|
1677
|
-
});
|
|
1678
|
-
},
|
|
1679
|
-
|
|
1680
|
-
setupController() {
|
|
1681
|
-
assert.ok(true, "Should still invoke bar's setupController");
|
|
1682
|
-
},
|
|
1683
|
-
})
|
|
1684
|
-
);
|
|
1685
|
-
|
|
1686
|
-
this.add(
|
|
1687
|
-
'route:bar.baz',
|
|
1688
|
-
Route.extend({
|
|
1689
|
-
setupController() {
|
|
1690
|
-
assert.ok(true, "Should still invoke bar.baz's setupController");
|
|
1691
|
-
},
|
|
1692
|
-
})
|
|
1693
|
-
);
|
|
1694
|
-
|
|
1695
|
-
return this.visit('/foo/bar/baz').then(() => {
|
|
1696
|
-
assert.ok(true, '/foo/bar/baz has been handled');
|
|
1697
|
-
assert.equal(
|
|
1698
|
-
this.applicationInstance.lookup('controller:application').get('currentPath'),
|
|
1699
|
-
'foo.bar.baz'
|
|
1700
|
-
);
|
|
1701
|
-
assert.equal(successCount, 1, 'transitionTo success handler was called once');
|
|
1702
|
-
});
|
|
1703
|
-
}
|
|
1704
|
-
|
|
1705
|
-
['@test Redirecting to the current target with a different context aborts the remainder of the routes'](
|
|
1706
|
-
assert
|
|
1707
|
-
) {
|
|
1708
|
-
assert.expect(4);
|
|
1709
|
-
|
|
1710
|
-
this.router.map(function() {
|
|
1711
|
-
this.route('home');
|
|
1712
|
-
this.route('foo', function() {
|
|
1713
|
-
this.route('bar', { path: 'bar/:id', resetNamespace: true }, function() {
|
|
1714
|
-
this.route('baz');
|
|
1715
|
-
});
|
|
1716
|
-
});
|
|
1717
|
-
});
|
|
1718
|
-
|
|
1719
|
-
let model = { id: 2 };
|
|
1720
|
-
|
|
1721
|
-
let count = 0;
|
|
1722
|
-
|
|
1723
|
-
this.add(
|
|
1724
|
-
'route:bar',
|
|
1725
|
-
Route.extend({
|
|
1726
|
-
afterModel() {
|
|
1727
|
-
if (count++ > 10) {
|
|
1728
|
-
assert.ok(false, 'infinite loop');
|
|
1729
|
-
} else {
|
|
1730
|
-
this.transitionTo('bar.baz', model);
|
|
1731
|
-
}
|
|
1732
|
-
},
|
|
1733
|
-
})
|
|
1734
|
-
);
|
|
1735
|
-
|
|
1736
|
-
this.add(
|
|
1737
|
-
'route:bar.baz',
|
|
1738
|
-
Route.extend({
|
|
1739
|
-
setupController() {
|
|
1740
|
-
assert.ok(true, 'Should still invoke setupController');
|
|
1741
|
-
},
|
|
1742
|
-
})
|
|
1743
|
-
);
|
|
1744
|
-
|
|
1745
|
-
return this.visit('/').then(() => {
|
|
1746
|
-
this.handleURLAborts(assert, '/foo/bar/1/baz');
|
|
1747
|
-
assert.equal(
|
|
1748
|
-
this.applicationInstance.lookup('controller:application').get('currentPath'),
|
|
1749
|
-
'foo.bar.baz'
|
|
1750
|
-
);
|
|
1751
|
-
assert.equal(
|
|
1752
|
-
this.applicationInstance
|
|
1753
|
-
.lookup('router:main')
|
|
1754
|
-
.get('location')
|
|
1755
|
-
.getURL(),
|
|
1756
|
-
'/foo/bar/2/baz'
|
|
1757
|
-
);
|
|
1758
|
-
});
|
|
1759
|
-
}
|
|
1760
|
-
|
|
1761
|
-
['@test Transitioning from a parent event does not prevent currentPath from being set'](
|
|
1762
|
-
assert
|
|
1763
|
-
) {
|
|
1764
|
-
this.router.map(function() {
|
|
1765
|
-
this.route('foo', function() {
|
|
1766
|
-
this.route('bar', { resetNamespace: true }, function() {
|
|
1767
|
-
this.route('baz');
|
|
1768
|
-
});
|
|
1769
|
-
this.route('qux');
|
|
1770
|
-
});
|
|
1771
|
-
});
|
|
1772
|
-
|
|
1773
|
-
this.add(
|
|
1774
|
-
'route:foo',
|
|
1775
|
-
Route.extend({
|
|
1776
|
-
actions: {
|
|
1777
|
-
goToQux() {
|
|
1778
|
-
this.transitionTo('foo.qux');
|
|
1779
|
-
},
|
|
1780
|
-
},
|
|
1781
|
-
})
|
|
1782
|
-
);
|
|
1783
|
-
|
|
1784
|
-
return this.visit('/foo/bar/baz').then(() => {
|
|
1785
|
-
assert.ok(true, '/foo/bar/baz has been handled');
|
|
1786
|
-
let applicationController = this.applicationInstance.lookup('controller:application');
|
|
1787
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
1788
|
-
assert.equal(applicationController.get('currentPath'), 'foo.bar.baz');
|
|
1789
|
-
run(() => router.send('goToQux'));
|
|
1790
|
-
assert.equal(applicationController.get('currentPath'), 'foo.qux');
|
|
1791
|
-
assert.equal(router.get('location').getURL(), '/foo/qux');
|
|
1792
|
-
});
|
|
1793
|
-
}
|
|
1794
|
-
|
|
1795
|
-
['@test Generated names can be customized when providing routes with dot notation'](assert) {
|
|
1796
|
-
assert.expect(4);
|
|
1797
|
-
|
|
1798
|
-
this.addTemplate('index', '<div>Index</div>');
|
|
1799
|
-
this.addTemplate('application', "<h1>Home</h1><div class='main'>{{outlet}}</div>");
|
|
1800
|
-
this.addTemplate('foo', "<div class='middle'>{{outlet}}</div>");
|
|
1801
|
-
this.addTemplate('bar', "<div class='bottom'>{{outlet}}</div>");
|
|
1802
|
-
this.addTemplate('bar.baz', '<p>{{name}}Bottom!</p>');
|
|
1803
|
-
|
|
1804
|
-
this.router.map(function() {
|
|
1805
|
-
this.route('foo', { path: '/top' }, function() {
|
|
1806
|
-
this.route('bar', { path: '/middle', resetNamespace: true }, function() {
|
|
1807
|
-
this.route('baz', { path: '/bottom' });
|
|
1808
|
-
});
|
|
1809
|
-
});
|
|
1810
|
-
});
|
|
1811
|
-
|
|
1812
|
-
this.add(
|
|
1813
|
-
'route:foo',
|
|
1814
|
-
Route.extend({
|
|
1815
|
-
renderTemplate() {
|
|
1816
|
-
assert.ok(true, 'FooBarRoute was called');
|
|
1817
|
-
return this._super(...arguments);
|
|
1818
|
-
},
|
|
1819
|
-
})
|
|
1820
|
-
);
|
|
1821
|
-
|
|
1822
|
-
this.add(
|
|
1823
|
-
'route:bar.baz',
|
|
1824
|
-
Route.extend({
|
|
1825
|
-
renderTemplate() {
|
|
1826
|
-
assert.ok(true, 'BarBazRoute was called');
|
|
1827
|
-
return this._super(...arguments);
|
|
1828
|
-
},
|
|
1829
|
-
})
|
|
1830
|
-
);
|
|
1831
|
-
|
|
1832
|
-
this.add(
|
|
1833
|
-
'controller:bar',
|
|
1834
|
-
Controller.extend({
|
|
1835
|
-
name: 'Bar',
|
|
1836
|
-
})
|
|
1837
|
-
);
|
|
1838
|
-
|
|
1839
|
-
this.add(
|
|
1840
|
-
'controller:bar.baz',
|
|
1841
|
-
Controller.extend({
|
|
1842
|
-
name: 'BarBaz',
|
|
1843
|
-
})
|
|
1844
|
-
);
|
|
1845
|
-
|
|
1846
|
-
return this.visit('/top/middle/bottom').then(() => {
|
|
1847
|
-
assert.ok(true, '/top/middle/bottom has been handled');
|
|
1848
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
1849
|
-
assert.equal(
|
|
1850
|
-
getTextOf(rootElement.querySelector('.main .middle .bottom p')),
|
|
1851
|
-
'BarBazBottom!',
|
|
1852
|
-
'The templates were rendered into their appropriate parents'
|
|
1853
|
-
);
|
|
1854
|
-
});
|
|
1855
|
-
}
|
|
1856
|
-
|
|
1857
|
-
["@test Child routes render into their parent route's template by default"](assert) {
|
|
1858
|
-
this.addTemplate('index', '<div>Index</div>');
|
|
1859
|
-
this.addTemplate('application', "<h1>Home</h1><div class='main'>{{outlet}}</div>");
|
|
1860
|
-
this.addTemplate('top', "<div class='middle'>{{outlet}}</div>");
|
|
1861
|
-
this.addTemplate('middle', "<div class='bottom'>{{outlet}}</div>");
|
|
1862
|
-
this.addTemplate('middle.bottom', '<p>Bottom!</p>');
|
|
1863
|
-
|
|
1864
|
-
this.router.map(function() {
|
|
1865
|
-
this.route('top', function() {
|
|
1866
|
-
this.route('middle', { resetNamespace: true }, function() {
|
|
1867
|
-
this.route('bottom');
|
|
1868
|
-
});
|
|
1869
|
-
});
|
|
1870
|
-
});
|
|
1871
|
-
|
|
1872
|
-
return this.visit('/top/middle/bottom').then(() => {
|
|
1873
|
-
assert.ok(true, '/top/middle/bottom has been handled');
|
|
1874
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
1875
|
-
assert.equal(
|
|
1876
|
-
getTextOf(rootElement.querySelector('.main .middle .bottom p')),
|
|
1877
|
-
'Bottom!',
|
|
1878
|
-
'The templates were rendered into their appropriate parents'
|
|
1879
|
-
);
|
|
1880
|
-
});
|
|
1881
|
-
}
|
|
1882
|
-
|
|
1883
|
-
['@test Child routes render into specified template'](assert) {
|
|
1884
|
-
this.addTemplate('index', '<div>Index</div>');
|
|
1885
|
-
this.addTemplate('application', "<h1>Home</h1><div class='main'>{{outlet}}</div>");
|
|
1886
|
-
this.addTemplate('top', "<div class='middle'>{{outlet}}</div>");
|
|
1887
|
-
this.addTemplate('middle', "<div class='bottom'>{{outlet}}</div>");
|
|
1888
|
-
this.addTemplate('middle.bottom', '<p>Bottom!</p>');
|
|
1889
|
-
|
|
1890
|
-
this.router.map(function() {
|
|
1891
|
-
this.route('top', function() {
|
|
1892
|
-
this.route('middle', { resetNamespace: true }, function() {
|
|
1893
|
-
this.route('bottom');
|
|
1894
|
-
});
|
|
1895
|
-
});
|
|
1896
|
-
});
|
|
1897
|
-
|
|
1898
|
-
this.add(
|
|
1899
|
-
'route:middle.bottom',
|
|
1900
|
-
Route.extend({
|
|
1901
|
-
renderTemplate() {
|
|
1902
|
-
this.render('middle/bottom', { into: 'top' });
|
|
1903
|
-
},
|
|
1904
|
-
})
|
|
1905
|
-
);
|
|
1906
|
-
|
|
1907
|
-
return this.visit('/top/middle/bottom').then(() => {
|
|
1908
|
-
assert.ok(true, '/top/middle/bottom has been handled');
|
|
1909
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
1910
|
-
assert.equal(
|
|
1911
|
-
rootElement.querySelectorAll('.main .middle .bottom p').length,
|
|
1912
|
-
0,
|
|
1913
|
-
'should not render into the middle template'
|
|
1914
|
-
);
|
|
1915
|
-
assert.equal(
|
|
1916
|
-
getTextOf(rootElement.querySelector('.main .middle > p')),
|
|
1917
|
-
'Bottom!',
|
|
1918
|
-
'The template was rendered into the top template'
|
|
1919
|
-
);
|
|
1920
|
-
});
|
|
1921
|
-
}
|
|
1922
|
-
|
|
1923
|
-
['@test Rendering into specified template with slash notation'](assert) {
|
|
1924
|
-
this.addTemplate('person.profile', 'profile {{outlet}}');
|
|
1925
|
-
this.addTemplate('person.details', 'details!');
|
|
1926
|
-
|
|
1927
|
-
this.router.map(function() {
|
|
1928
|
-
this.route('home', { path: '/' });
|
|
1929
|
-
});
|
|
1930
|
-
|
|
1931
|
-
this.add(
|
|
1932
|
-
'route:home',
|
|
1933
|
-
Route.extend({
|
|
1934
|
-
renderTemplate() {
|
|
1935
|
-
this.render('person/profile');
|
|
1936
|
-
this.render('person/details', { into: 'person/profile' });
|
|
1937
|
-
},
|
|
1938
|
-
})
|
|
1939
|
-
);
|
|
1940
|
-
|
|
1941
|
-
return this.visit('/').then(() => {
|
|
1942
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
1943
|
-
assert.equal(
|
|
1944
|
-
rootElement.textContent.trim(),
|
|
1945
|
-
'profile details!',
|
|
1946
|
-
'The templates were rendered'
|
|
1947
|
-
);
|
|
1948
|
-
});
|
|
1949
|
-
}
|
|
1950
|
-
|
|
1951
|
-
['@test Parent route context change'](assert) {
|
|
1952
|
-
let editCount = 0;
|
|
1953
|
-
let editedPostIds = emberA();
|
|
1954
|
-
|
|
1955
|
-
this.addTemplate('application', '{{outlet}}');
|
|
1956
|
-
this.addTemplate('posts', '{{outlet}}');
|
|
1957
|
-
this.addTemplate('post', '{{outlet}}');
|
|
1958
|
-
this.addTemplate('post/index', 'showing');
|
|
1959
|
-
this.addTemplate('post/edit', 'editing');
|
|
1960
|
-
|
|
1961
|
-
this.router.map(function() {
|
|
1962
|
-
this.route('posts', function() {
|
|
1963
|
-
this.route('post', { path: '/:postId', resetNamespace: true }, function() {
|
|
1964
|
-
this.route('edit');
|
|
1965
|
-
});
|
|
1966
|
-
});
|
|
1967
|
-
});
|
|
1968
|
-
|
|
1969
|
-
this.add(
|
|
1970
|
-
'route:posts',
|
|
1971
|
-
Route.extend({
|
|
1972
|
-
actions: {
|
|
1973
|
-
showPost(context) {
|
|
1974
|
-
this.transitionTo('post', context);
|
|
1975
|
-
},
|
|
1976
|
-
},
|
|
1977
|
-
})
|
|
1978
|
-
);
|
|
1979
|
-
|
|
1980
|
-
this.add(
|
|
1981
|
-
'route:post',
|
|
1982
|
-
Route.extend({
|
|
1983
|
-
model(params) {
|
|
1984
|
-
return { id: params.postId };
|
|
1985
|
-
},
|
|
1986
|
-
|
|
1987
|
-
serialize(model) {
|
|
1988
|
-
return { postId: model.id };
|
|
1989
|
-
},
|
|
1990
|
-
|
|
1991
|
-
actions: {
|
|
1992
|
-
editPost() {
|
|
1993
|
-
this.transitionTo('post.edit');
|
|
1994
|
-
},
|
|
1995
|
-
},
|
|
1996
|
-
})
|
|
1997
|
-
);
|
|
1998
|
-
|
|
1999
|
-
this.add(
|
|
2000
|
-
'route:post.edit',
|
|
2001
|
-
Route.extend({
|
|
2002
|
-
model() {
|
|
2003
|
-
let postId = this.modelFor('post').id;
|
|
2004
|
-
editedPostIds.push(postId);
|
|
2005
|
-
return null;
|
|
2006
|
-
},
|
|
2007
|
-
setup() {
|
|
2008
|
-
this._super(...arguments);
|
|
2009
|
-
editCount++;
|
|
2010
|
-
},
|
|
2011
|
-
})
|
|
2012
|
-
);
|
|
2013
|
-
|
|
2014
|
-
return this.visit('/posts/1').then(() => {
|
|
2015
|
-
assert.ok(true, '/posts/1 has been handled');
|
|
2016
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
2017
|
-
run(() => router.send('editPost'));
|
|
2018
|
-
run(() => router.send('showPost', { id: '2' }));
|
|
2019
|
-
run(() => router.send('editPost'));
|
|
2020
|
-
assert.equal(editCount, 2, 'set up the edit route twice without failure');
|
|
2021
|
-
assert.deepEqual(
|
|
2022
|
-
editedPostIds,
|
|
2023
|
-
['1', '2'],
|
|
2024
|
-
'modelFor posts.post returns the right context'
|
|
2025
|
-
);
|
|
2026
|
-
});
|
|
2027
|
-
}
|
|
2028
|
-
|
|
2029
|
-
['@test Router accounts for rootURL on page load when using history location'](assert) {
|
|
2030
|
-
let rootURL = window.location.pathname + '/app';
|
|
2031
|
-
let postsTemplateRendered = false;
|
|
2032
|
-
let setHistory;
|
|
2033
|
-
|
|
2034
|
-
setHistory = function(obj, path) {
|
|
2035
|
-
obj.set('history', { state: { path: path } });
|
|
2036
|
-
};
|
|
2037
|
-
|
|
2038
|
-
let location = HistoryLocation.create({
|
|
2039
|
-
initState() {
|
|
2040
|
-
let path = rootURL + '/posts';
|
|
2041
|
-
|
|
2042
|
-
setHistory(this, path);
|
|
2043
|
-
this.set('location', {
|
|
2044
|
-
pathname: path,
|
|
2045
|
-
href: 'http://localhost/' + path,
|
|
2046
|
-
});
|
|
2047
|
-
},
|
|
2048
|
-
|
|
2049
|
-
replaceState(path) {
|
|
2050
|
-
setHistory(this, path);
|
|
2051
|
-
},
|
|
2052
|
-
|
|
2053
|
-
pushState(path) {
|
|
2054
|
-
setHistory(this, path);
|
|
2055
|
-
},
|
|
2056
|
-
});
|
|
2057
|
-
|
|
2058
|
-
this.router.reopen({
|
|
2059
|
-
// location: 'historyTest',
|
|
2060
|
-
location,
|
|
2061
|
-
rootURL: rootURL,
|
|
2062
|
-
});
|
|
2063
|
-
|
|
2064
|
-
this.router.map(function() {
|
|
2065
|
-
this.route('posts', { path: '/posts' });
|
|
2066
|
-
});
|
|
2067
|
-
|
|
2068
|
-
this.add(
|
|
2069
|
-
'route:posts',
|
|
2070
|
-
Route.extend({
|
|
2071
|
-
model() {},
|
|
2072
|
-
renderTemplate() {
|
|
2073
|
-
postsTemplateRendered = true;
|
|
2074
|
-
},
|
|
2075
|
-
})
|
|
2076
|
-
);
|
|
2077
|
-
|
|
2078
|
-
return this.visit('/').then(() => {
|
|
2079
|
-
assert.ok(postsTemplateRendered, 'Posts route successfully stripped from rootURL');
|
|
2080
|
-
|
|
2081
|
-
runDestroy(location);
|
|
2082
|
-
location = null;
|
|
2083
|
-
});
|
|
2084
|
-
}
|
|
2085
|
-
|
|
2086
|
-
['@test The rootURL is passed properly to the location implementation'](assert) {
|
|
2087
|
-
assert.expect(1);
|
|
2088
|
-
let rootURL = '/blahzorz';
|
|
2089
|
-
this.add(
|
|
2090
|
-
'location:history-test',
|
|
2091
|
-
HistoryLocation.extend({
|
|
2092
|
-
rootURL: 'this is not the URL you are looking for',
|
|
2093
|
-
history: {
|
|
2094
|
-
pushState() {},
|
|
2095
|
-
},
|
|
2096
|
-
initState() {
|
|
2097
|
-
assert.equal(this.get('rootURL'), rootURL);
|
|
2098
|
-
},
|
|
2099
|
-
})
|
|
2100
|
-
);
|
|
2101
|
-
|
|
2102
|
-
this.router.reopen({
|
|
2103
|
-
location: 'history-test',
|
|
2104
|
-
rootURL: rootURL,
|
|
2105
|
-
// if we transition in this test we will receive failures
|
|
2106
|
-
// if the tests are run from a static file
|
|
2107
|
-
_doURLTransition() {
|
|
2108
|
-
return RSVP.resolve('');
|
|
2109
|
-
},
|
|
2110
|
-
});
|
|
2111
|
-
|
|
2112
|
-
return this.visit('/');
|
|
2113
|
-
}
|
|
2114
|
-
|
|
2115
|
-
['@test Only use route rendered into main outlet for default into property on child'](assert) {
|
|
2116
|
-
this.addTemplate('application', "{{outlet 'menu'}}{{outlet}}");
|
|
2117
|
-
this.addTemplate('posts', '{{outlet}}');
|
|
2118
|
-
this.addTemplate('posts.index', '<p class="posts-index">postsIndex</p>');
|
|
2119
|
-
this.addTemplate('posts.menu', '<div class="posts-menu">postsMenu</div>');
|
|
2120
|
-
|
|
2121
|
-
this.router.map(function() {
|
|
2122
|
-
this.route('posts', function() {});
|
|
2123
|
-
});
|
|
2124
|
-
|
|
2125
|
-
this.add(
|
|
2126
|
-
'route:posts',
|
|
2127
|
-
Route.extend({
|
|
2128
|
-
renderTemplate() {
|
|
2129
|
-
this.render();
|
|
2130
|
-
this.render('posts/menu', {
|
|
2131
|
-
into: 'application',
|
|
2132
|
-
outlet: 'menu',
|
|
2133
|
-
});
|
|
2134
|
-
},
|
|
2135
|
-
})
|
|
2136
|
-
);
|
|
2137
|
-
|
|
2138
|
-
return this.visit('/posts').then(() => {
|
|
2139
|
-
assert.ok(true, '/posts has been handled');
|
|
2140
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
2141
|
-
assert.equal(
|
|
2142
|
-
getTextOf(rootElement.querySelector('div.posts-menu')),
|
|
2143
|
-
'postsMenu',
|
|
2144
|
-
'The posts/menu template was rendered'
|
|
2145
|
-
);
|
|
2146
|
-
assert.equal(
|
|
2147
|
-
getTextOf(rootElement.querySelector('p.posts-index')),
|
|
2148
|
-
'postsIndex',
|
|
2149
|
-
'The posts/index template was rendered'
|
|
2150
|
-
);
|
|
2151
|
-
});
|
|
2152
|
-
}
|
|
2153
|
-
|
|
2154
|
-
['@test Generating a URL should not affect currentModel'](assert) {
|
|
2155
|
-
this.router.map(function() {
|
|
2156
|
-
this.route('post', { path: '/posts/:post_id' });
|
|
2157
|
-
});
|
|
2158
|
-
|
|
2159
|
-
let posts = {
|
|
2160
|
-
1: { id: 1 },
|
|
2161
|
-
2: { id: 2 },
|
|
2162
|
-
};
|
|
2163
|
-
|
|
2164
|
-
this.add(
|
|
2165
|
-
'route:post',
|
|
2166
|
-
Route.extend({
|
|
2167
|
-
model(params) {
|
|
2168
|
-
return posts[params.post_id];
|
|
2169
|
-
},
|
|
2170
|
-
})
|
|
2171
|
-
);
|
|
2172
|
-
|
|
2173
|
-
return this.visit('/posts/1').then(() => {
|
|
2174
|
-
assert.ok(true, '/posts/1 has been handled');
|
|
2175
|
-
|
|
2176
|
-
let route = this.applicationInstance.lookup('route:post');
|
|
2177
|
-
assert.equal(route.modelFor('post'), posts[1]);
|
|
2178
|
-
|
|
2179
|
-
let url = this.applicationInstance.lookup('router:main').generate('post', posts[2]);
|
|
2180
|
-
assert.equal(url, '/posts/2');
|
|
2181
|
-
assert.equal(route.modelFor('post'), posts[1]);
|
|
2182
|
-
});
|
|
2183
|
-
}
|
|
2184
|
-
|
|
2185
|
-
["@test Nested index route is not overridden by parent's implicit index route"](assert) {
|
|
2186
|
-
this.router.map(function() {
|
|
2187
|
-
this.route('posts', function() {
|
|
2188
|
-
this.route('index', { path: ':category' });
|
|
2189
|
-
});
|
|
2190
|
-
});
|
|
2191
|
-
|
|
2192
|
-
return this.visit('/')
|
|
2193
|
-
.then(() => {
|
|
2194
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
2195
|
-
return router.transitionTo('posts', { category: 'emberjs' });
|
|
2196
|
-
})
|
|
2197
|
-
.then(() => {
|
|
2198
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
2199
|
-
assert.deepEqual(router.location.path, '/posts/emberjs');
|
|
2200
|
-
});
|
|
2201
|
-
}
|
|
2202
|
-
|
|
2203
|
-
['@test Application template does not duplicate when re-rendered'](assert) {
|
|
2204
|
-
this.addTemplate('application', '<h3 class="render-once">I render once</h3>{{outlet}}');
|
|
2205
|
-
|
|
2206
|
-
this.router.map(function() {
|
|
2207
|
-
this.route('posts');
|
|
2208
|
-
});
|
|
2209
|
-
|
|
2210
|
-
this.add(
|
|
2211
|
-
'route:application',
|
|
2212
|
-
Route.extend({
|
|
2213
|
-
model() {
|
|
2214
|
-
return emberA();
|
|
2215
|
-
},
|
|
2216
|
-
})
|
|
2217
|
-
);
|
|
2218
|
-
|
|
2219
|
-
return this.visit('/posts').then(() => {
|
|
2220
|
-
assert.ok(true, '/posts has been handled');
|
|
2221
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
2222
|
-
assert.equal(getTextOf(rootElement.querySelector('h3.render-once')), 'I render once');
|
|
2223
|
-
});
|
|
2224
|
-
}
|
|
2225
|
-
|
|
2226
|
-
['@test Child routes should render inside the application template if the application template causes a redirect'](
|
|
2227
|
-
assert
|
|
2228
|
-
) {
|
|
2229
|
-
this.addTemplate('application', '<h3>App</h3> {{outlet}}');
|
|
2230
|
-
this.addTemplate('posts', 'posts');
|
|
2231
|
-
|
|
2232
|
-
this.router.map(function() {
|
|
2233
|
-
this.route('posts');
|
|
2234
|
-
this.route('photos');
|
|
2235
|
-
});
|
|
2236
|
-
|
|
2237
|
-
this.add(
|
|
2238
|
-
'route:application',
|
|
2239
|
-
Route.extend({
|
|
2240
|
-
afterModel() {
|
|
2241
|
-
this.transitionTo('posts');
|
|
2242
|
-
},
|
|
2243
|
-
})
|
|
2244
|
-
);
|
|
2245
|
-
|
|
2246
|
-
return this.visit('/posts').then(() => {
|
|
2247
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
2248
|
-
assert.equal(rootElement.textContent.trim(), 'App posts');
|
|
2249
|
-
});
|
|
2250
|
-
}
|
|
2251
|
-
|
|
2252
|
-
["@test The template is not re-rendered when the route's context changes"](assert) {
|
|
2253
|
-
this.router.map(function() {
|
|
2254
|
-
this.route('page', { path: '/page/:name' });
|
|
2255
|
-
});
|
|
2256
|
-
|
|
2257
|
-
this.add(
|
|
2258
|
-
'route:page',
|
|
2259
|
-
Route.extend({
|
|
2260
|
-
model(params) {
|
|
2261
|
-
return EmberObject.create({ name: params.name });
|
|
2262
|
-
},
|
|
2263
|
-
})
|
|
2264
|
-
);
|
|
2265
|
-
|
|
2266
|
-
let insertionCount = 0;
|
|
2267
|
-
this.add(
|
|
2268
|
-
'component:foo-bar',
|
|
2269
|
-
Component.extend({
|
|
2270
|
-
didInsertElement() {
|
|
2271
|
-
insertionCount += 1;
|
|
2272
|
-
},
|
|
2273
|
-
})
|
|
2274
|
-
);
|
|
2275
|
-
|
|
2276
|
-
this.addTemplate('page', '<p>{{model.name}}{{foo-bar}}</p>');
|
|
2277
|
-
|
|
2278
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
2279
|
-
return this.visit('/page/first')
|
|
2280
|
-
.then(() => {
|
|
2281
|
-
assert.ok(true, '/page/first has been handled');
|
|
2282
|
-
assert.equal(getTextOf(rootElement.querySelector('p')), 'first');
|
|
2283
|
-
assert.equal(insertionCount, 1);
|
|
2284
|
-
return this.visit('/page/second');
|
|
2285
|
-
})
|
|
2286
|
-
.then(() => {
|
|
2287
|
-
assert.ok(true, '/page/second has been handled');
|
|
2288
|
-
assert.equal(getTextOf(rootElement.querySelector('p')), 'second');
|
|
2289
|
-
assert.equal(insertionCount, 1, 'view should have inserted only once');
|
|
2290
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
2291
|
-
return run(() => router.transitionTo('page', EmberObject.create({ name: 'third' })));
|
|
2292
|
-
})
|
|
2293
|
-
.then(() => {
|
|
2294
|
-
assert.equal(getTextOf(rootElement.querySelector('p')), 'third');
|
|
2295
|
-
assert.equal(insertionCount, 1, 'view should still have inserted only once');
|
|
2296
|
-
});
|
|
2297
|
-
}
|
|
2298
|
-
|
|
2299
|
-
['@test The template is not re-rendered when two routes present the exact same template & controller'](
|
|
2300
|
-
assert
|
|
2301
|
-
) {
|
|
2302
|
-
this.router.map(function() {
|
|
2303
|
-
this.route('first');
|
|
2304
|
-
this.route('second');
|
|
2305
|
-
this.route('third');
|
|
2306
|
-
this.route('fourth');
|
|
2307
|
-
});
|
|
2308
|
-
|
|
2309
|
-
// Note add a component to test insertion
|
|
2310
|
-
|
|
2311
|
-
let insertionCount = 0;
|
|
2312
|
-
this.add(
|
|
2313
|
-
'component:x-input',
|
|
2314
|
-
Component.extend({
|
|
2315
|
-
didInsertElement() {
|
|
2316
|
-
insertionCount += 1;
|
|
2317
|
-
},
|
|
2318
|
-
})
|
|
2319
|
-
);
|
|
2320
|
-
|
|
2321
|
-
let SharedRoute = Route.extend({
|
|
2322
|
-
setupController() {
|
|
2323
|
-
this.controllerFor('shared').set('message', 'This is the ' + this.routeName + ' message');
|
|
2324
|
-
},
|
|
2325
|
-
|
|
2326
|
-
renderTemplate() {
|
|
2327
|
-
this.render('shared', { controller: 'shared' });
|
|
2328
|
-
},
|
|
2329
|
-
});
|
|
2330
|
-
|
|
2331
|
-
this.add('route:shared', SharedRoute);
|
|
2332
|
-
this.add('route:first', SharedRoute.extend());
|
|
2333
|
-
this.add('route:second', SharedRoute.extend());
|
|
2334
|
-
this.add('route:third', SharedRoute.extend());
|
|
2335
|
-
this.add('route:fourth', SharedRoute.extend());
|
|
2336
|
-
|
|
2337
|
-
this.add('controller:shared', Controller.extend());
|
|
2338
|
-
|
|
2339
|
-
this.addTemplate('shared', '<p>{{message}}{{x-input}}</p>');
|
|
2340
|
-
|
|
2341
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
2342
|
-
return this.visit('/first')
|
|
2343
|
-
.then(() => {
|
|
2344
|
-
assert.ok(true, '/first has been handled');
|
|
2345
|
-
assert.equal(getTextOf(rootElement.querySelector('p')), 'This is the first message');
|
|
2346
|
-
assert.equal(insertionCount, 1, 'expected one assertion');
|
|
2347
|
-
return this.visit('/second');
|
|
2348
|
-
})
|
|
2349
|
-
.then(() => {
|
|
2350
|
-
assert.ok(true, '/second has been handled');
|
|
2351
|
-
assert.equal(getTextOf(rootElement.querySelector('p')), 'This is the second message');
|
|
2352
|
-
assert.equal(insertionCount, 1, 'expected one assertion');
|
|
2353
|
-
return run(() => {
|
|
2354
|
-
this.applicationInstance
|
|
2355
|
-
.lookup('router:main')
|
|
2356
|
-
.transitionTo('third')
|
|
2357
|
-
.then(
|
|
2358
|
-
function() {
|
|
2359
|
-
assert.ok(true, 'expected transition');
|
|
2360
|
-
},
|
|
2361
|
-
function(reason) {
|
|
2362
|
-
assert.ok(false, 'unexpected transition failure: ', QUnit.jsDump.parse(reason));
|
|
2363
|
-
}
|
|
2364
|
-
);
|
|
2365
|
-
});
|
|
2366
|
-
})
|
|
2367
|
-
.then(() => {
|
|
2368
|
-
assert.equal(getTextOf(rootElement.querySelector('p')), 'This is the third message');
|
|
2369
|
-
assert.equal(insertionCount, 1, 'expected one assertion');
|
|
2370
|
-
return this.visit('fourth');
|
|
2371
|
-
})
|
|
2372
|
-
.then(() => {
|
|
2373
|
-
assert.ok(true, '/fourth has been handled');
|
|
2374
|
-
assert.equal(insertionCount, 1, 'expected one assertion');
|
|
2375
|
-
assert.equal(getTextOf(rootElement.querySelector('p')), 'This is the fourth message');
|
|
2376
|
-
});
|
|
2377
|
-
}
|
|
2378
|
-
|
|
2379
|
-
['@test ApplicationRoute with model does not proxy the currentPath'](assert) {
|
|
2380
|
-
let model = {};
|
|
2381
|
-
let currentPath;
|
|
2382
|
-
|
|
2383
|
-
this.router.map(function() {
|
|
2384
|
-
this.route('index', { path: '/' });
|
|
2385
|
-
});
|
|
2386
|
-
|
|
2387
|
-
this.add(
|
|
2388
|
-
'route:application',
|
|
2389
|
-
Route.extend({
|
|
2390
|
-
model() {
|
|
2391
|
-
return model;
|
|
2392
|
-
},
|
|
2393
|
-
})
|
|
2394
|
-
);
|
|
2395
|
-
|
|
2396
|
-
this.add(
|
|
2397
|
-
'controller:application',
|
|
2398
|
-
Controller.extend({
|
|
2399
|
-
currentPathDidChange: observer('currentPath', function() {
|
|
2400
|
-
currentPath = this.currentPath;
|
|
2401
|
-
}),
|
|
2402
|
-
})
|
|
2403
|
-
);
|
|
2404
|
-
|
|
2405
|
-
return this.visit('/').then(() => {
|
|
2406
|
-
assert.equal(currentPath, 'index', 'currentPath is index');
|
|
2407
|
-
assert.equal(
|
|
2408
|
-
'currentPath' in model,
|
|
2409
|
-
false,
|
|
2410
|
-
'should have defined currentPath on controller'
|
|
2411
|
-
);
|
|
2412
|
-
});
|
|
2413
|
-
}
|
|
2414
|
-
|
|
2415
|
-
['@test Promises encountered on app load put app into loading state until resolved'](assert) {
|
|
2416
|
-
assert.expect(2);
|
|
2417
|
-
|
|
2418
|
-
let deferred = RSVP.defer();
|
|
2419
|
-
this.router.map(function() {
|
|
2420
|
-
this.route('index', { path: '/' });
|
|
2421
|
-
});
|
|
2422
|
-
|
|
2423
|
-
this.add(
|
|
2424
|
-
'route:index',
|
|
2425
|
-
Route.extend({
|
|
2426
|
-
model() {
|
|
2427
|
-
return deferred.promise;
|
|
2428
|
-
},
|
|
2429
|
-
})
|
|
2430
|
-
);
|
|
2431
|
-
|
|
2432
|
-
this.addTemplate('index', '<p>INDEX</p>');
|
|
2433
|
-
this.addTemplate('loading', '<p>LOADING</p>');
|
|
2434
|
-
|
|
2435
|
-
run(() => this.visit('/'));
|
|
2436
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
2437
|
-
assert.equal(
|
|
2438
|
-
getTextOf(rootElement.querySelector('p')),
|
|
2439
|
-
'LOADING',
|
|
2440
|
-
'The loading state is displaying.'
|
|
2441
|
-
);
|
|
2442
|
-
run(deferred.resolve);
|
|
2443
|
-
assert.equal(
|
|
2444
|
-
getTextOf(rootElement.querySelector('p')),
|
|
2445
|
-
'INDEX',
|
|
2446
|
-
'The index route is display.'
|
|
2447
|
-
);
|
|
2448
|
-
}
|
|
2449
|
-
|
|
2450
|
-
['@test Route should tear down multiple outlets'](assert) {
|
|
2451
|
-
this.addTemplate('application', "{{outlet 'menu'}}{{outlet}}{{outlet 'footer'}}");
|
|
2452
|
-
this.addTemplate('posts', '{{outlet}}');
|
|
2453
|
-
this.addTemplate('users', 'users');
|
|
2454
|
-
this.addTemplate('posts.index', '<p class="posts-index">postsIndex</p>');
|
|
2455
|
-
this.addTemplate('posts.menu', '<div class="posts-menu">postsMenu</div>');
|
|
2456
|
-
this.addTemplate('posts.footer', '<div class="posts-footer">postsFooter</div>');
|
|
2457
|
-
|
|
2458
|
-
this.router.map(function() {
|
|
2459
|
-
this.route('posts', function() {});
|
|
2460
|
-
this.route('users', function() {});
|
|
2461
|
-
});
|
|
2462
|
-
|
|
2463
|
-
this.add(
|
|
2464
|
-
'route:posts',
|
|
2465
|
-
Route.extend({
|
|
2466
|
-
renderTemplate() {
|
|
2467
|
-
this.render('posts/menu', {
|
|
2468
|
-
into: 'application',
|
|
2469
|
-
outlet: 'menu',
|
|
2470
|
-
});
|
|
2471
|
-
|
|
2472
|
-
this.render();
|
|
2473
|
-
|
|
2474
|
-
this.render('posts/footer', {
|
|
2475
|
-
into: 'application',
|
|
2476
|
-
outlet: 'footer',
|
|
2477
|
-
});
|
|
2478
|
-
},
|
|
2479
|
-
})
|
|
2480
|
-
);
|
|
2481
|
-
|
|
2482
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
2483
|
-
return this.visit('/posts')
|
|
2484
|
-
.then(() => {
|
|
2485
|
-
assert.ok(true, '/posts has been handled');
|
|
2486
|
-
assert.equal(
|
|
2487
|
-
getTextOf(rootElement.querySelector('div.posts-menu')),
|
|
2488
|
-
'postsMenu',
|
|
2489
|
-
'The posts/menu template was rendered'
|
|
2490
|
-
);
|
|
2491
|
-
assert.equal(
|
|
2492
|
-
getTextOf(rootElement.querySelector('p.posts-index')),
|
|
2493
|
-
'postsIndex',
|
|
2494
|
-
'The posts/index template was rendered'
|
|
2495
|
-
);
|
|
2496
|
-
assert.equal(
|
|
2497
|
-
getTextOf(rootElement.querySelector('div.posts-footer')),
|
|
2498
|
-
'postsFooter',
|
|
2499
|
-
'The posts/footer template was rendered'
|
|
2500
|
-
);
|
|
2501
|
-
|
|
2502
|
-
return this.visit('/users');
|
|
2503
|
-
})
|
|
2504
|
-
.then(() => {
|
|
2505
|
-
assert.ok(true, '/users has been handled');
|
|
2506
|
-
assert.equal(
|
|
2507
|
-
rootElement.querySelector('div.posts-menu'),
|
|
2508
|
-
null,
|
|
2509
|
-
'The posts/menu template was removed'
|
|
2510
|
-
);
|
|
2511
|
-
assert.equal(
|
|
2512
|
-
rootElement.querySelector('p.posts-index'),
|
|
2513
|
-
null,
|
|
2514
|
-
'The posts/index template was removed'
|
|
2515
|
-
);
|
|
2516
|
-
assert.equal(
|
|
2517
|
-
rootElement.querySelector('div.posts-footer'),
|
|
2518
|
-
null,
|
|
2519
|
-
'The posts/footer template was removed'
|
|
2520
|
-
);
|
|
2521
|
-
});
|
|
2522
|
-
}
|
|
2523
|
-
|
|
2524
|
-
['@test Route will assert if you try to explicitly render {into: ...} a missing template']() {
|
|
2525
|
-
expectDeprecation(
|
|
2526
|
-
/Rendering into a {{render}} helper that resolves to an {{outlet}} is deprecated./
|
|
2527
|
-
);
|
|
2528
|
-
|
|
2529
|
-
this.router.map(function() {
|
|
2530
|
-
this.route('home', { path: '/' });
|
|
2531
|
-
});
|
|
2532
|
-
|
|
2533
|
-
this.add(
|
|
2534
|
-
'route:home',
|
|
2535
|
-
Route.extend({
|
|
2536
|
-
renderTemplate() {
|
|
2537
|
-
this.render({ into: 'nonexistent' });
|
|
2538
|
-
},
|
|
2539
|
-
})
|
|
2540
|
-
);
|
|
2541
|
-
|
|
2542
|
-
expectAssertion(
|
|
2543
|
-
() => this.visit('/'),
|
|
2544
|
-
"You attempted to render into 'nonexistent' but it was not found"
|
|
2545
|
-
);
|
|
2546
|
-
}
|
|
2547
|
-
|
|
2548
|
-
['@test Route supports clearing outlet explicitly'](assert) {
|
|
2549
|
-
this.addTemplate('application', "{{outlet}}{{outlet 'modal'}}");
|
|
2550
|
-
this.addTemplate('posts', '{{outlet}}');
|
|
2551
|
-
this.addTemplate('users', 'users');
|
|
2552
|
-
this.addTemplate('posts.index', '<div class="posts-index">postsIndex {{outlet}}</div>');
|
|
2553
|
-
this.addTemplate('posts.modal', '<div class="posts-modal">postsModal</div>');
|
|
2554
|
-
this.addTemplate('posts.extra', '<div class="posts-extra">postsExtra</div>');
|
|
2555
|
-
|
|
2556
|
-
this.router.map(function() {
|
|
2557
|
-
this.route('posts', function() {});
|
|
2558
|
-
this.route('users', function() {});
|
|
2559
|
-
});
|
|
2560
|
-
|
|
2561
|
-
this.add(
|
|
2562
|
-
'route:posts',
|
|
2563
|
-
Route.extend({
|
|
2564
|
-
actions: {
|
|
2565
|
-
showModal() {
|
|
2566
|
-
this.render('posts/modal', {
|
|
2567
|
-
into: 'application',
|
|
2568
|
-
outlet: 'modal',
|
|
2569
|
-
});
|
|
2570
|
-
},
|
|
2571
|
-
hideModal() {
|
|
2572
|
-
this.disconnectOutlet({
|
|
2573
|
-
outlet: 'modal',
|
|
2574
|
-
parentView: 'application',
|
|
2575
|
-
});
|
|
2576
|
-
},
|
|
2577
|
-
},
|
|
2578
|
-
})
|
|
2579
|
-
);
|
|
2580
|
-
|
|
2581
|
-
this.add(
|
|
2582
|
-
'route:posts.index',
|
|
2583
|
-
Route.extend({
|
|
2584
|
-
actions: {
|
|
2585
|
-
showExtra() {
|
|
2586
|
-
this.render('posts/extra', {
|
|
2587
|
-
into: 'posts/index',
|
|
2588
|
-
});
|
|
2589
|
-
},
|
|
2590
|
-
hideExtra() {
|
|
2591
|
-
this.disconnectOutlet({ parentView: 'posts/index' });
|
|
2592
|
-
},
|
|
2593
|
-
},
|
|
2594
|
-
})
|
|
2595
|
-
);
|
|
2596
|
-
|
|
2597
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
2598
|
-
|
|
2599
|
-
return this.visit('/posts')
|
|
2600
|
-
.then(() => {
|
|
2601
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
2602
|
-
|
|
2603
|
-
assert.equal(
|
|
2604
|
-
getTextOf(rootElement.querySelector('div.posts-index')),
|
|
2605
|
-
'postsIndex',
|
|
2606
|
-
'The posts/index template was rendered'
|
|
2607
|
-
);
|
|
2608
|
-
run(() => router.send('showModal'));
|
|
2609
|
-
assert.equal(
|
|
2610
|
-
getTextOf(rootElement.querySelector('div.posts-modal')),
|
|
2611
|
-
'postsModal',
|
|
2612
|
-
'The posts/modal template was rendered'
|
|
2613
|
-
);
|
|
2614
|
-
run(() => router.send('showExtra'));
|
|
2615
|
-
|
|
2616
|
-
assert.equal(
|
|
2617
|
-
getTextOf(rootElement.querySelector('div.posts-extra')),
|
|
2618
|
-
'postsExtra',
|
|
2619
|
-
'The posts/extra template was rendered'
|
|
2620
|
-
);
|
|
2621
|
-
run(() => router.send('hideModal'));
|
|
2622
|
-
|
|
2623
|
-
assert.equal(
|
|
2624
|
-
rootElement.querySelector('div.posts-modal'),
|
|
2625
|
-
null,
|
|
2626
|
-
'The posts/modal template was removed'
|
|
2627
|
-
);
|
|
2628
|
-
run(() => router.send('hideExtra'));
|
|
2629
|
-
|
|
2630
|
-
assert.equal(
|
|
2631
|
-
rootElement.querySelector('div.posts-extra'),
|
|
2632
|
-
null,
|
|
2633
|
-
'The posts/extra template was removed'
|
|
2634
|
-
);
|
|
2635
|
-
run(function() {
|
|
2636
|
-
router.send('showModal');
|
|
2637
|
-
});
|
|
2638
|
-
assert.equal(
|
|
2639
|
-
getTextOf(rootElement.querySelector('div.posts-modal')),
|
|
2640
|
-
'postsModal',
|
|
2641
|
-
'The posts/modal template was rendered'
|
|
2642
|
-
);
|
|
2643
|
-
run(function() {
|
|
2644
|
-
router.send('showExtra');
|
|
2645
|
-
});
|
|
2646
|
-
assert.equal(
|
|
2647
|
-
getTextOf(rootElement.querySelector('div.posts-extra')),
|
|
2648
|
-
'postsExtra',
|
|
2649
|
-
'The posts/extra template was rendered'
|
|
2650
|
-
);
|
|
2651
|
-
return this.visit('/users');
|
|
2652
|
-
})
|
|
2653
|
-
.then(() => {
|
|
2654
|
-
assert.equal(
|
|
2655
|
-
rootElement.querySelector('div.posts-index'),
|
|
2656
|
-
null,
|
|
2657
|
-
'The posts/index template was removed'
|
|
2658
|
-
);
|
|
2659
|
-
assert.equal(
|
|
2660
|
-
rootElement.querySelector('div.posts-modal'),
|
|
2661
|
-
null,
|
|
2662
|
-
'The posts/modal template was removed'
|
|
2663
|
-
);
|
|
2664
|
-
assert.equal(
|
|
2665
|
-
rootElement.querySelector('div.posts-extra'),
|
|
2666
|
-
null,
|
|
2667
|
-
'The posts/extra template was removed'
|
|
2668
|
-
);
|
|
2669
|
-
});
|
|
2670
|
-
}
|
|
2671
|
-
|
|
2672
|
-
['@test Route supports clearing outlet using string parameter'](assert) {
|
|
2673
|
-
this.addTemplate('application', "{{outlet}}{{outlet 'modal'}}");
|
|
2674
|
-
this.addTemplate('posts', '{{outlet}}');
|
|
2675
|
-
this.addTemplate('users', 'users');
|
|
2676
|
-
this.addTemplate('posts.index', '<div class="posts-index">postsIndex {{outlet}}</div>');
|
|
2677
|
-
this.addTemplate('posts.modal', '<div class="posts-modal">postsModal</div>');
|
|
2678
|
-
|
|
2679
|
-
this.router.map(function() {
|
|
2680
|
-
this.route('posts', function() {});
|
|
2681
|
-
this.route('users', function() {});
|
|
2682
|
-
});
|
|
2683
|
-
|
|
2684
|
-
this.add(
|
|
2685
|
-
'route:posts',
|
|
2686
|
-
Route.extend({
|
|
2687
|
-
actions: {
|
|
2688
|
-
showModal() {
|
|
2689
|
-
this.render('posts/modal', {
|
|
2690
|
-
into: 'application',
|
|
2691
|
-
outlet: 'modal',
|
|
2692
|
-
});
|
|
2693
|
-
},
|
|
2694
|
-
hideModal() {
|
|
2695
|
-
this.disconnectOutlet('modal');
|
|
2696
|
-
},
|
|
2697
|
-
},
|
|
2698
|
-
})
|
|
2699
|
-
);
|
|
2700
|
-
|
|
2701
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
2702
|
-
return this.visit('/posts')
|
|
2703
|
-
.then(() => {
|
|
2704
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
2705
|
-
assert.equal(
|
|
2706
|
-
getTextOf(rootElement.querySelector('div.posts-index')),
|
|
2707
|
-
'postsIndex',
|
|
2708
|
-
'The posts/index template was rendered'
|
|
2709
|
-
);
|
|
2710
|
-
run(() => router.send('showModal'));
|
|
2711
|
-
assert.equal(
|
|
2712
|
-
getTextOf(rootElement.querySelector('div.posts-modal')),
|
|
2713
|
-
'postsModal',
|
|
2714
|
-
'The posts/modal template was rendered'
|
|
2715
|
-
);
|
|
2716
|
-
run(() => router.send('hideModal'));
|
|
2717
|
-
assert.equal(
|
|
2718
|
-
rootElement.querySelector('div.posts-modal'),
|
|
2719
|
-
null,
|
|
2720
|
-
'The posts/modal template was removed'
|
|
2721
|
-
);
|
|
2722
|
-
return this.visit('/users');
|
|
2723
|
-
})
|
|
2724
|
-
.then(() => {
|
|
2725
|
-
assert.equal(
|
|
2726
|
-
rootElement.querySelector('div.posts-index'),
|
|
2727
|
-
null,
|
|
2728
|
-
'The posts/index template was removed'
|
|
2729
|
-
);
|
|
2730
|
-
assert.equal(
|
|
2731
|
-
rootElement.querySelector('div.posts-modal'),
|
|
2732
|
-
null,
|
|
2733
|
-
'The posts/modal template was removed'
|
|
2734
|
-
);
|
|
2735
|
-
});
|
|
2736
|
-
}
|
|
2737
|
-
|
|
2738
|
-
['@test Route silently fails when cleaning an outlet from an inactive view'](assert) {
|
|
2739
|
-
assert.expect(1); // handleURL
|
|
2740
|
-
|
|
2741
|
-
this.addTemplate('application', '{{outlet}}');
|
|
2742
|
-
this.addTemplate('posts', "{{outlet 'modal'}}");
|
|
2743
|
-
this.addTemplate('modal', 'A Yo.');
|
|
2744
|
-
|
|
2745
|
-
this.router.map(function() {
|
|
2746
|
-
this.route('posts');
|
|
2747
|
-
});
|
|
2748
|
-
|
|
2749
|
-
this.add(
|
|
2750
|
-
'route:posts',
|
|
2751
|
-
Route.extend({
|
|
2752
|
-
actions: {
|
|
2753
|
-
hideSelf() {
|
|
2754
|
-
this.disconnectOutlet({
|
|
2755
|
-
outlet: 'main',
|
|
2756
|
-
parentView: 'application',
|
|
2757
|
-
});
|
|
2758
|
-
},
|
|
2759
|
-
showModal() {
|
|
2760
|
-
this.render('modal', { into: 'posts', outlet: 'modal' });
|
|
2761
|
-
},
|
|
2762
|
-
hideModal() {
|
|
2763
|
-
this.disconnectOutlet({ outlet: 'modal', parentView: 'posts' });
|
|
2764
|
-
},
|
|
2765
|
-
},
|
|
2766
|
-
})
|
|
2767
|
-
);
|
|
2768
|
-
|
|
2769
|
-
return this.visit('/posts').then(() => {
|
|
2770
|
-
assert.ok(true, '/posts has been handled');
|
|
2771
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
2772
|
-
run(() => router.send('showModal'));
|
|
2773
|
-
run(() => router.send('hideSelf'));
|
|
2774
|
-
run(() => router.send('hideModal'));
|
|
2775
|
-
});
|
|
2776
|
-
}
|
|
2777
|
-
|
|
2778
|
-
['@test Router `willTransition` hook passes in cancellable transition'](assert) {
|
|
2779
|
-
// Should hit willTransition 3 times, once for the initial route, and then 2 more times
|
|
2780
|
-
// for the two handleURL calls below
|
|
2781
|
-
assert.expect(5);
|
|
2782
|
-
|
|
2783
|
-
this.router.map(function() {
|
|
2784
|
-
this.route('nork');
|
|
2785
|
-
this.route('about');
|
|
2786
|
-
});
|
|
2787
|
-
|
|
2788
|
-
this.router.reopen({
|
|
2789
|
-
willTransition(_, _2, transition) {
|
|
2790
|
-
assert.ok(true, 'willTransition was called');
|
|
2791
|
-
if (transition.intent.url !== '/') {
|
|
2792
|
-
transition.abort();
|
|
2793
|
-
}
|
|
2794
|
-
},
|
|
2795
|
-
});
|
|
2796
|
-
|
|
2797
|
-
this.add(
|
|
2798
|
-
'route:loading',
|
|
2799
|
-
Route.extend({
|
|
2800
|
-
activate() {
|
|
2801
|
-
assert.ok(false, 'LoadingRoute was not entered');
|
|
2802
|
-
},
|
|
2803
|
-
})
|
|
2804
|
-
);
|
|
2805
|
-
|
|
2806
|
-
this.add(
|
|
2807
|
-
'route:nork',
|
|
2808
|
-
Route.extend({
|
|
2809
|
-
activate() {
|
|
2810
|
-
assert.ok(false, 'NorkRoute was not entered');
|
|
2811
|
-
},
|
|
2812
|
-
})
|
|
2813
|
-
);
|
|
2814
|
-
|
|
2815
|
-
this.add(
|
|
2816
|
-
'route:about',
|
|
2817
|
-
Route.extend({
|
|
2818
|
-
activate() {
|
|
2819
|
-
assert.ok(false, 'AboutRoute was not entered');
|
|
2820
|
-
},
|
|
2821
|
-
})
|
|
2822
|
-
);
|
|
2823
|
-
|
|
2824
|
-
return this.visit('/').then(() => {
|
|
2825
|
-
this.handleURLAborts(assert, '/nork');
|
|
2826
|
-
this.handleURLAborts(assert, '/about');
|
|
2827
|
-
});
|
|
2828
|
-
}
|
|
2829
|
-
|
|
2830
|
-
['@test Aborting/redirecting the transition in `willTransition` prevents LoadingRoute from being entered'](
|
|
2831
|
-
assert
|
|
2832
|
-
) {
|
|
2833
|
-
assert.expect(5);
|
|
2834
|
-
|
|
2835
|
-
this.router.map(function() {
|
|
2836
|
-
this.route('index');
|
|
2837
|
-
this.route('nork');
|
|
2838
|
-
this.route('about');
|
|
2839
|
-
});
|
|
2840
|
-
|
|
2841
|
-
let redirect = false;
|
|
2842
|
-
|
|
2843
|
-
this.add(
|
|
2844
|
-
'route:index',
|
|
2845
|
-
Route.extend({
|
|
2846
|
-
actions: {
|
|
2847
|
-
willTransition(transition) {
|
|
2848
|
-
assert.ok(true, 'willTransition was called');
|
|
2849
|
-
if (redirect) {
|
|
2850
|
-
// router.js won't refire `willTransition` for this redirect
|
|
2851
|
-
this.transitionTo('about');
|
|
2852
|
-
} else {
|
|
2853
|
-
transition.abort();
|
|
2854
|
-
}
|
|
2855
|
-
},
|
|
2856
|
-
},
|
|
2857
|
-
})
|
|
2858
|
-
);
|
|
2859
|
-
|
|
2860
|
-
let deferred = null;
|
|
2861
|
-
|
|
2862
|
-
this.add(
|
|
2863
|
-
'route:loading',
|
|
2864
|
-
Route.extend({
|
|
2865
|
-
activate() {
|
|
2866
|
-
assert.ok(deferred, 'LoadingRoute should be entered at this time');
|
|
2867
|
-
},
|
|
2868
|
-
deactivate() {
|
|
2869
|
-
assert.ok(true, 'LoadingRoute was exited');
|
|
2870
|
-
},
|
|
2871
|
-
})
|
|
2872
|
-
);
|
|
2873
|
-
|
|
2874
|
-
this.add(
|
|
2875
|
-
'route:nork',
|
|
2876
|
-
Route.extend({
|
|
2877
|
-
activate() {
|
|
2878
|
-
assert.ok(true, 'NorkRoute was entered');
|
|
2879
|
-
},
|
|
2880
|
-
})
|
|
2881
|
-
);
|
|
2882
|
-
|
|
2883
|
-
this.add(
|
|
2884
|
-
'route:about',
|
|
2885
|
-
Route.extend({
|
|
2886
|
-
activate() {
|
|
2887
|
-
assert.ok(true, 'AboutRoute was entered');
|
|
2888
|
-
},
|
|
2889
|
-
model() {
|
|
2890
|
-
if (deferred) {
|
|
2891
|
-
return deferred.promise;
|
|
2892
|
-
}
|
|
2893
|
-
},
|
|
2894
|
-
})
|
|
2895
|
-
);
|
|
2896
|
-
|
|
2897
|
-
return this.visit('/').then(() => {
|
|
2898
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
2899
|
-
// Attempted transitions out of index should abort.
|
|
2900
|
-
run(router, 'transitionTo', 'nork');
|
|
2901
|
-
run(router, 'handleURL', '/nork');
|
|
2902
|
-
|
|
2903
|
-
// Attempted transitions out of index should redirect to about
|
|
2904
|
-
redirect = true;
|
|
2905
|
-
run(router, 'transitionTo', 'nork');
|
|
2906
|
-
run(router, 'transitionTo', 'index');
|
|
2907
|
-
|
|
2908
|
-
// Redirected transitions out of index to a route with a
|
|
2909
|
-
// promise model should pause the transition and
|
|
2910
|
-
// activate LoadingRoute
|
|
2911
|
-
deferred = RSVP.defer();
|
|
2912
|
-
run(router, 'transitionTo', 'nork');
|
|
2913
|
-
run(deferred.resolve);
|
|
2914
|
-
});
|
|
2915
|
-
}
|
|
2916
|
-
|
|
2917
|
-
['@test `didTransition` event fires on the router'](assert) {
|
|
2918
|
-
assert.expect(3);
|
|
2919
|
-
|
|
2920
|
-
this.router.map(function() {
|
|
2921
|
-
this.route('nork');
|
|
2922
|
-
});
|
|
2923
|
-
|
|
2924
|
-
return this.visit('/')
|
|
2925
|
-
.then(() => {
|
|
2926
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
2927
|
-
router.one('didTransition', function() {
|
|
2928
|
-
assert.ok(true, 'didTransition fired on initial routing');
|
|
2929
|
-
});
|
|
2930
|
-
this.visit('/');
|
|
2931
|
-
})
|
|
2932
|
-
.then(() => {
|
|
2933
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
2934
|
-
router.one('didTransition', function() {
|
|
2935
|
-
assert.ok(true, 'didTransition fired on the router');
|
|
2936
|
-
assert.equal(
|
|
2937
|
-
router.get('url'),
|
|
2938
|
-
'/nork',
|
|
2939
|
-
'The url property is updated by the time didTransition fires'
|
|
2940
|
-
);
|
|
2941
|
-
});
|
|
2942
|
-
|
|
2943
|
-
return this.visit('/nork');
|
|
2944
|
-
});
|
|
2945
|
-
}
|
|
2946
|
-
|
|
2947
|
-
['@test `didTransition` can be reopened'](assert) {
|
|
2948
|
-
assert.expect(1);
|
|
2949
|
-
|
|
2950
|
-
this.router.map(function() {
|
|
2951
|
-
this.route('nork');
|
|
2952
|
-
});
|
|
2953
|
-
|
|
2954
|
-
this.router.reopen({
|
|
2955
|
-
didTransition() {
|
|
2956
|
-
this._super(...arguments);
|
|
2957
|
-
assert.ok(true, 'reopened didTransition was called');
|
|
2958
|
-
},
|
|
2959
|
-
});
|
|
2960
|
-
|
|
2961
|
-
return this.visit('/');
|
|
2962
|
-
}
|
|
2963
|
-
|
|
2964
|
-
['@test `activate` event fires on the route'](assert) {
|
|
2965
|
-
assert.expect(2);
|
|
2966
|
-
|
|
2967
|
-
let eventFired = 0;
|
|
2968
|
-
|
|
2969
|
-
this.router.map(function() {
|
|
2970
|
-
this.route('nork');
|
|
2971
|
-
});
|
|
2972
|
-
|
|
2973
|
-
this.add(
|
|
2974
|
-
'route:nork',
|
|
2975
|
-
Route.extend({
|
|
2976
|
-
init() {
|
|
2977
|
-
this._super(...arguments);
|
|
2978
|
-
|
|
2979
|
-
this.on('activate', function() {
|
|
2980
|
-
assert.equal(++eventFired, 1, 'activate event is fired once');
|
|
2981
|
-
});
|
|
2982
|
-
},
|
|
2983
|
-
|
|
2984
|
-
activate() {
|
|
2985
|
-
assert.ok(true, 'activate hook is called');
|
|
2986
|
-
},
|
|
2987
|
-
})
|
|
2988
|
-
);
|
|
2989
|
-
|
|
2990
|
-
return this.visit('/nork');
|
|
2991
|
-
}
|
|
2992
|
-
|
|
2993
|
-
['@test `deactivate` event fires on the route'](assert) {
|
|
2994
|
-
assert.expect(2);
|
|
2995
|
-
|
|
2996
|
-
let eventFired = 0;
|
|
2997
|
-
|
|
2998
|
-
this.router.map(function() {
|
|
2999
|
-
this.route('nork');
|
|
3000
|
-
this.route('dork');
|
|
3001
|
-
});
|
|
3002
|
-
|
|
3003
|
-
this.add(
|
|
3004
|
-
'route:nork',
|
|
3005
|
-
Route.extend({
|
|
3006
|
-
init() {
|
|
3007
|
-
this._super(...arguments);
|
|
3008
|
-
|
|
3009
|
-
this.on('deactivate', function() {
|
|
3010
|
-
assert.equal(++eventFired, 1, 'deactivate event is fired once');
|
|
3011
|
-
});
|
|
3012
|
-
},
|
|
3013
|
-
|
|
3014
|
-
deactivate() {
|
|
3015
|
-
assert.ok(true, 'deactivate hook is called');
|
|
3016
|
-
},
|
|
3017
|
-
})
|
|
3018
|
-
);
|
|
3019
|
-
|
|
3020
|
-
return this.visit('/nork').then(() => this.visit('/dork'));
|
|
3021
|
-
}
|
|
3022
|
-
|
|
3023
|
-
['@test Actions can be handled by inherited action handlers'](assert) {
|
|
3024
|
-
assert.expect(4);
|
|
3025
|
-
|
|
3026
|
-
let SuperRoute = Route.extend({
|
|
3027
|
-
actions: {
|
|
3028
|
-
foo() {
|
|
3029
|
-
assert.ok(true, 'foo');
|
|
3030
|
-
},
|
|
3031
|
-
bar(msg) {
|
|
3032
|
-
assert.equal(msg, 'HELLO');
|
|
3033
|
-
},
|
|
3034
|
-
},
|
|
3035
|
-
});
|
|
3036
|
-
|
|
3037
|
-
let RouteMixin = Mixin.create({
|
|
3038
|
-
actions: {
|
|
3039
|
-
bar(msg) {
|
|
3040
|
-
assert.equal(msg, 'HELLO');
|
|
3041
|
-
this._super(msg);
|
|
3042
|
-
},
|
|
3043
|
-
},
|
|
3044
|
-
});
|
|
3045
|
-
|
|
3046
|
-
this.add(
|
|
3047
|
-
'route:home',
|
|
3048
|
-
SuperRoute.extend(RouteMixin, {
|
|
3049
|
-
actions: {
|
|
3050
|
-
baz() {
|
|
3051
|
-
assert.ok(true, 'baz');
|
|
3052
|
-
},
|
|
3053
|
-
},
|
|
3054
|
-
})
|
|
3055
|
-
);
|
|
3056
|
-
|
|
3057
|
-
this.addTemplate(
|
|
3058
|
-
'home',
|
|
3059
|
-
`
|
|
3060
|
-
<a class="do-foo" {{action "foo"}}>Do foo</a>
|
|
3061
|
-
<a class="do-bar-with-arg" {{action "bar" "HELLO"}}>Do bar with arg</a>
|
|
3062
|
-
<a class="do-baz" {{action "baz"}}>Do bar</a>
|
|
3063
|
-
`
|
|
3064
|
-
);
|
|
3065
|
-
|
|
3066
|
-
return this.visit('/').then(() => {
|
|
3067
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
3068
|
-
rootElement.querySelector('.do-foo').click();
|
|
3069
|
-
rootElement.querySelector('.do-bar-with-arg').click();
|
|
3070
|
-
rootElement.querySelector('.do-baz').click();
|
|
3071
|
-
});
|
|
3072
|
-
}
|
|
3073
|
-
|
|
3074
|
-
['@test transitionTo returns Transition when passed a route name'](assert) {
|
|
3075
|
-
assert.expect(1);
|
|
3076
|
-
|
|
3077
|
-
this.router.map(function() {
|
|
3078
|
-
this.route('root', { path: '/' });
|
|
3079
|
-
this.route('bar');
|
|
3080
|
-
});
|
|
3081
|
-
|
|
3082
|
-
return this.visit('/').then(() => {
|
|
3083
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
3084
|
-
let transition = run(() => router.transitionTo('bar'));
|
|
3085
|
-
assert.equal(transition instanceof Transition, true);
|
|
3086
|
-
});
|
|
3087
|
-
}
|
|
3088
|
-
|
|
3089
|
-
['@test transitionTo returns Transition when passed a url'](assert) {
|
|
3090
|
-
assert.expect(1);
|
|
3091
|
-
|
|
3092
|
-
this.router.map(function() {
|
|
3093
|
-
this.route('root', { path: '/' });
|
|
3094
|
-
this.route('bar', function() {
|
|
3095
|
-
this.route('baz');
|
|
3096
|
-
});
|
|
3097
|
-
});
|
|
3098
|
-
|
|
3099
|
-
return this.visit('/').then(() => {
|
|
3100
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
3101
|
-
let transition = run(() => router.transitionTo('/bar/baz'));
|
|
3102
|
-
assert.equal(transition instanceof Transition, true);
|
|
3103
|
-
});
|
|
3104
|
-
}
|
|
3105
|
-
|
|
3106
|
-
['@test currentRouteName is a property installed on ApplicationController that can be used in transitionTo'](
|
|
3107
|
-
assert
|
|
3108
|
-
) {
|
|
3109
|
-
assert.expect(24);
|
|
3110
|
-
|
|
3111
|
-
this.router.map(function() {
|
|
3112
|
-
this.route('index', { path: '/' });
|
|
3113
|
-
this.route('be', function() {
|
|
3114
|
-
this.route('excellent', { resetNamespace: true }, function() {
|
|
3115
|
-
this.route('to', { resetNamespace: true }, function() {
|
|
3116
|
-
this.route('each', { resetNamespace: true }, function() {
|
|
3117
|
-
this.route('other');
|
|
3118
|
-
});
|
|
3119
|
-
});
|
|
3120
|
-
});
|
|
3121
|
-
});
|
|
3122
|
-
});
|
|
3123
|
-
|
|
3124
|
-
return this.visit('/').then(() => {
|
|
3125
|
-
let appController = this.applicationInstance.lookup('controller:application');
|
|
3126
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
3127
|
-
|
|
3128
|
-
function transitionAndCheck(path, expectedPath, expectedRouteName) {
|
|
3129
|
-
if (path) {
|
|
3130
|
-
run(router, 'transitionTo', path);
|
|
3131
|
-
}
|
|
3132
|
-
assert.equal(appController.get('currentPath'), expectedPath);
|
|
3133
|
-
assert.equal(appController.get('currentRouteName'), expectedRouteName);
|
|
3134
|
-
}
|
|
3135
|
-
|
|
3136
|
-
transitionAndCheck(null, 'index', 'index');
|
|
3137
|
-
transitionAndCheck('/be', 'be.index', 'be.index');
|
|
3138
|
-
transitionAndCheck('/be/excellent', 'be.excellent.index', 'excellent.index');
|
|
3139
|
-
transitionAndCheck('/be/excellent/to', 'be.excellent.to.index', 'to.index');
|
|
3140
|
-
transitionAndCheck('/be/excellent/to/each', 'be.excellent.to.each.index', 'each.index');
|
|
3141
|
-
transitionAndCheck(
|
|
3142
|
-
'/be/excellent/to/each/other',
|
|
3143
|
-
'be.excellent.to.each.other',
|
|
3144
|
-
'each.other'
|
|
3145
|
-
);
|
|
3146
|
-
|
|
3147
|
-
transitionAndCheck('index', 'index', 'index');
|
|
3148
|
-
transitionAndCheck('be', 'be.index', 'be.index');
|
|
3149
|
-
transitionAndCheck('excellent', 'be.excellent.index', 'excellent.index');
|
|
3150
|
-
transitionAndCheck('to.index', 'be.excellent.to.index', 'to.index');
|
|
3151
|
-
transitionAndCheck('each', 'be.excellent.to.each.index', 'each.index');
|
|
3152
|
-
transitionAndCheck('each.other', 'be.excellent.to.each.other', 'each.other');
|
|
3153
|
-
});
|
|
3154
|
-
}
|
|
3155
|
-
|
|
3156
|
-
['@test Route model hook finds the same model as a manual find'](assert) {
|
|
3157
|
-
let post;
|
|
3158
|
-
let Post = EmberObject.extend();
|
|
3159
|
-
this.add('model:post', Post);
|
|
3160
|
-
Post.reopenClass({
|
|
3161
|
-
find() {
|
|
3162
|
-
post = this;
|
|
3163
|
-
return {};
|
|
3164
|
-
},
|
|
3165
|
-
});
|
|
3166
|
-
|
|
3167
|
-
this.router.map(function() {
|
|
3168
|
-
this.route('post', { path: '/post/:post_id' });
|
|
3169
|
-
});
|
|
3170
|
-
|
|
3171
|
-
return this.visit('/post/1').then(() => {
|
|
3172
|
-
assert.equal(Post, post);
|
|
3173
|
-
});
|
|
3174
|
-
}
|
|
3175
|
-
|
|
3176
|
-
['@test Routes can refresh themselves causing their model hooks to be re-run'](assert) {
|
|
3177
|
-
this.router.map(function() {
|
|
3178
|
-
this.route('parent', { path: '/parent/:parent_id' }, function() {
|
|
3179
|
-
this.route('child');
|
|
3180
|
-
});
|
|
3181
|
-
});
|
|
3182
|
-
|
|
3183
|
-
let appcount = 0;
|
|
3184
|
-
this.add(
|
|
3185
|
-
'route:application',
|
|
3186
|
-
Route.extend({
|
|
3187
|
-
model() {
|
|
3188
|
-
++appcount;
|
|
3189
|
-
},
|
|
3190
|
-
})
|
|
3191
|
-
);
|
|
3192
|
-
|
|
3193
|
-
let parentcount = 0;
|
|
3194
|
-
this.add(
|
|
3195
|
-
'route:parent',
|
|
3196
|
-
Route.extend({
|
|
3197
|
-
model(params) {
|
|
3198
|
-
assert.equal(params.parent_id, '123');
|
|
3199
|
-
++parentcount;
|
|
3200
|
-
},
|
|
3201
|
-
actions: {
|
|
3202
|
-
refreshParent() {
|
|
3203
|
-
this.refresh();
|
|
3204
|
-
},
|
|
3205
|
-
},
|
|
3206
|
-
})
|
|
3207
|
-
);
|
|
3208
|
-
|
|
3209
|
-
let childcount = 0;
|
|
3210
|
-
this.add(
|
|
3211
|
-
'route:parent.child',
|
|
3212
|
-
Route.extend({
|
|
3213
|
-
model() {
|
|
3214
|
-
++childcount;
|
|
3215
|
-
},
|
|
3216
|
-
})
|
|
3217
|
-
);
|
|
3218
|
-
|
|
3219
|
-
let router;
|
|
3220
|
-
return this.visit('/')
|
|
3221
|
-
.then(() => {
|
|
3222
|
-
router = this.applicationInstance.lookup('router:main');
|
|
3223
|
-
assert.equal(appcount, 1);
|
|
3224
|
-
assert.equal(parentcount, 0);
|
|
3225
|
-
assert.equal(childcount, 0);
|
|
3226
|
-
return run(router, 'transitionTo', 'parent.child', '123');
|
|
3227
|
-
})
|
|
3228
|
-
.then(() => {
|
|
3229
|
-
assert.equal(appcount, 1);
|
|
3230
|
-
assert.equal(parentcount, 1);
|
|
3231
|
-
assert.equal(childcount, 1);
|
|
3232
|
-
return run(router, 'send', 'refreshParent');
|
|
3233
|
-
})
|
|
3234
|
-
.then(() => {
|
|
3235
|
-
assert.equal(appcount, 1);
|
|
3236
|
-
assert.equal(parentcount, 2);
|
|
3237
|
-
assert.equal(childcount, 2);
|
|
3238
|
-
});
|
|
3239
|
-
}
|
|
3240
|
-
|
|
3241
|
-
['@test Specifying non-existent controller name in route#render throws'](assert) {
|
|
3242
|
-
assert.expect(1);
|
|
3243
|
-
|
|
3244
|
-
this.router.map(function() {
|
|
3245
|
-
this.route('home', { path: '/' });
|
|
3246
|
-
});
|
|
3247
|
-
|
|
3248
|
-
this.add(
|
|
3249
|
-
'route:home',
|
|
3250
|
-
Route.extend({
|
|
3251
|
-
renderTemplate() {
|
|
3252
|
-
expectAssertion(() => {
|
|
3253
|
-
this.render('homepage', {
|
|
3254
|
-
controller: 'stefanpenneristhemanforme',
|
|
3255
|
-
});
|
|
3256
|
-
}, "You passed `controller: 'stefanpenneristhemanforme'` into the `render` method, but no such controller could be found.");
|
|
3257
|
-
},
|
|
3258
|
-
})
|
|
3259
|
-
);
|
|
3260
|
-
|
|
3261
|
-
return this.visit('/');
|
|
3262
|
-
}
|
|
3263
|
-
|
|
3264
|
-
["@test Redirecting with null model doesn't error out"](assert) {
|
|
3265
|
-
this.router.map(function() {
|
|
3266
|
-
this.route('home', { path: '/' });
|
|
3267
|
-
this.route('about', { path: '/about/:hurhurhur' });
|
|
3268
|
-
});
|
|
3269
|
-
|
|
3270
|
-
this.add(
|
|
3271
|
-
'route:about',
|
|
3272
|
-
Route.extend({
|
|
3273
|
-
serialize: function(model) {
|
|
3274
|
-
if (model === null) {
|
|
3275
|
-
return { hurhurhur: 'TreeklesMcGeekles' };
|
|
3276
|
-
}
|
|
3277
|
-
},
|
|
3278
|
-
})
|
|
3279
|
-
);
|
|
3280
|
-
|
|
3281
|
-
this.add(
|
|
3282
|
-
'route:home',
|
|
3283
|
-
Route.extend({
|
|
3284
|
-
beforeModel() {
|
|
3285
|
-
this.transitionTo('about', null);
|
|
3286
|
-
},
|
|
3287
|
-
})
|
|
3288
|
-
);
|
|
3289
|
-
|
|
3290
|
-
return this.visit('/').then(() => {
|
|
3291
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
3292
|
-
assert.equal(router.get('location.path'), '/about/TreeklesMcGeekles');
|
|
3293
|
-
});
|
|
3294
|
-
}
|
|
3295
|
-
|
|
3296
|
-
['@test rejecting the model hooks promise with a non-error prints the `message` property'](
|
|
3297
|
-
assert
|
|
3298
|
-
) {
|
|
3299
|
-
assert.expect(5);
|
|
3300
|
-
|
|
3301
|
-
let rejectedMessage = 'OMG!! SOOOOOO BAD!!!!';
|
|
3302
|
-
let rejectedStack = 'Yeah, buddy: stack gets printed too.';
|
|
3303
|
-
|
|
3304
|
-
this.router.map(function() {
|
|
3305
|
-
this.route('yippie', { path: '/' });
|
|
3306
|
-
});
|
|
3307
|
-
|
|
3308
|
-
console.error = function(initialMessage, errorMessage, errorStack) {
|
|
3309
|
-
assert.equal(
|
|
3310
|
-
initialMessage,
|
|
3311
|
-
'Error while processing route: yippie',
|
|
3312
|
-
'a message with the current route name is printed'
|
|
3313
|
-
);
|
|
3314
|
-
assert.equal(
|
|
3315
|
-
errorMessage,
|
|
3316
|
-
rejectedMessage,
|
|
3317
|
-
"the rejected reason's message property is logged"
|
|
3318
|
-
);
|
|
3319
|
-
assert.equal(errorStack, rejectedStack, "the rejected reason's stack property is logged");
|
|
3320
|
-
};
|
|
3321
|
-
|
|
3322
|
-
this.add(
|
|
3323
|
-
'route:yippie',
|
|
3324
|
-
Route.extend({
|
|
3325
|
-
model() {
|
|
3326
|
-
return RSVP.reject({
|
|
3327
|
-
message: rejectedMessage,
|
|
3328
|
-
stack: rejectedStack,
|
|
3329
|
-
});
|
|
3330
|
-
},
|
|
3331
|
-
})
|
|
3332
|
-
);
|
|
3333
|
-
|
|
3334
|
-
return assert.throws(
|
|
3335
|
-
() => {
|
|
3336
|
-
return this.visit('/');
|
|
3337
|
-
},
|
|
3338
|
-
function(err) {
|
|
3339
|
-
assert.equal(err.message, rejectedMessage);
|
|
3340
|
-
return true;
|
|
3341
|
-
},
|
|
3342
|
-
'expected an exception'
|
|
3343
|
-
);
|
|
3344
|
-
}
|
|
3345
|
-
|
|
3346
|
-
['@test rejecting the model hooks promise with an error with `errorThrown` property prints `errorThrown.message` property'](
|
|
3347
|
-
assert
|
|
3348
|
-
) {
|
|
3349
|
-
assert.expect(5);
|
|
3350
|
-
let rejectedMessage = 'OMG!! SOOOOOO BAD!!!!';
|
|
3351
|
-
let rejectedStack = 'Yeah, buddy: stack gets printed too.';
|
|
3352
|
-
|
|
3353
|
-
this.router.map(function() {
|
|
3354
|
-
this.route('yippie', { path: '/' });
|
|
3355
|
-
});
|
|
3356
|
-
|
|
3357
|
-
console.error = function(initialMessage, errorMessage, errorStack) {
|
|
3358
|
-
assert.equal(
|
|
3359
|
-
initialMessage,
|
|
3360
|
-
'Error while processing route: yippie',
|
|
3361
|
-
'a message with the current route name is printed'
|
|
3362
|
-
);
|
|
3363
|
-
assert.equal(
|
|
3364
|
-
errorMessage,
|
|
3365
|
-
rejectedMessage,
|
|
3366
|
-
"the rejected reason's message property is logged"
|
|
3367
|
-
);
|
|
3368
|
-
assert.equal(errorStack, rejectedStack, "the rejected reason's stack property is logged");
|
|
3369
|
-
};
|
|
3370
|
-
|
|
3371
|
-
this.add(
|
|
3372
|
-
'route:yippie',
|
|
3373
|
-
Route.extend({
|
|
3374
|
-
model() {
|
|
3375
|
-
return RSVP.reject({
|
|
3376
|
-
errorThrown: { message: rejectedMessage, stack: rejectedStack },
|
|
3377
|
-
});
|
|
3378
|
-
},
|
|
3379
|
-
})
|
|
3380
|
-
);
|
|
3381
|
-
|
|
3382
|
-
assert.throws(
|
|
3383
|
-
() => this.visit('/'),
|
|
3384
|
-
function(err) {
|
|
3385
|
-
assert.equal(err.message, rejectedMessage);
|
|
3386
|
-
return true;
|
|
3387
|
-
},
|
|
3388
|
-
'expected an exception'
|
|
3389
|
-
);
|
|
3390
|
-
}
|
|
3391
|
-
|
|
3392
|
-
['@test rejecting the model hooks promise with no reason still logs error'](assert) {
|
|
3393
|
-
assert.expect(2);
|
|
3394
|
-
this.router.map(function() {
|
|
3395
|
-
this.route('wowzers', { path: '/' });
|
|
3396
|
-
});
|
|
3397
|
-
|
|
3398
|
-
console.error = function(initialMessage) {
|
|
3399
|
-
assert.equal(
|
|
3400
|
-
initialMessage,
|
|
3401
|
-
'Error while processing route: wowzers',
|
|
3402
|
-
'a message with the current route name is printed'
|
|
3403
|
-
);
|
|
3404
|
-
};
|
|
3405
|
-
|
|
3406
|
-
this.add(
|
|
3407
|
-
'route:wowzers',
|
|
3408
|
-
Route.extend({
|
|
3409
|
-
model() {
|
|
3410
|
-
return RSVP.reject();
|
|
3411
|
-
},
|
|
3412
|
-
})
|
|
3413
|
-
);
|
|
3414
|
-
|
|
3415
|
-
return assert.throws(() => this.visit('/'));
|
|
3416
|
-
}
|
|
3417
|
-
|
|
3418
|
-
['@test rejecting the model hooks promise with a string shows a good error'](assert) {
|
|
3419
|
-
assert.expect(3);
|
|
3420
|
-
let rejectedMessage = 'Supercalifragilisticexpialidocious';
|
|
3421
|
-
|
|
3422
|
-
this.router.map(function() {
|
|
3423
|
-
this.route('yondo', { path: '/' });
|
|
3424
|
-
});
|
|
3425
|
-
|
|
3426
|
-
console.error = function(initialMessage, errorMessage) {
|
|
3427
|
-
assert.equal(
|
|
3428
|
-
initialMessage,
|
|
3429
|
-
'Error while processing route: yondo',
|
|
3430
|
-
'a message with the current route name is printed'
|
|
3431
|
-
);
|
|
3432
|
-
assert.equal(
|
|
3433
|
-
errorMessage,
|
|
3434
|
-
rejectedMessage,
|
|
3435
|
-
"the rejected reason's message property is logged"
|
|
3436
|
-
);
|
|
3437
|
-
};
|
|
3438
|
-
|
|
3439
|
-
this.add(
|
|
3440
|
-
'route:yondo',
|
|
3441
|
-
Route.extend({
|
|
3442
|
-
model() {
|
|
3443
|
-
return RSVP.reject(rejectedMessage);
|
|
3444
|
-
},
|
|
3445
|
-
})
|
|
3446
|
-
);
|
|
3447
|
-
|
|
3448
|
-
assert.throws(() => this.visit('/'), new RegExp(rejectedMessage), 'expected an exception');
|
|
3449
|
-
}
|
|
3450
|
-
|
|
3451
|
-
["@test willLeave, willChangeContext, willChangeModel actions don't fire unless feature flag enabled"](
|
|
3452
|
-
assert
|
|
3453
|
-
) {
|
|
3454
|
-
assert.expect(1);
|
|
3455
|
-
|
|
3456
|
-
this.router.map(function() {
|
|
3457
|
-
this.route('about');
|
|
3458
|
-
});
|
|
3459
|
-
|
|
3460
|
-
function shouldNotFire() {
|
|
3461
|
-
assert.ok(false, "this action shouldn't have been received");
|
|
3462
|
-
}
|
|
3463
|
-
|
|
3464
|
-
this.add(
|
|
3465
|
-
'route:index',
|
|
3466
|
-
Route.extend({
|
|
3467
|
-
actions: {
|
|
3468
|
-
willChangeModel: shouldNotFire,
|
|
3469
|
-
willChangeContext: shouldNotFire,
|
|
3470
|
-
willLeave: shouldNotFire,
|
|
3471
|
-
},
|
|
3472
|
-
})
|
|
3473
|
-
);
|
|
3474
|
-
|
|
3475
|
-
this.add(
|
|
3476
|
-
'route:about',
|
|
3477
|
-
Route.extend({
|
|
3478
|
-
setupController() {
|
|
3479
|
-
assert.ok(true, 'about route was entered');
|
|
3480
|
-
},
|
|
3481
|
-
})
|
|
3482
|
-
);
|
|
3483
|
-
|
|
3484
|
-
return this.visit('/about');
|
|
3485
|
-
}
|
|
3486
|
-
|
|
3487
|
-
['@test Errors in transitionTo within redirect hook are logged'](assert) {
|
|
3488
|
-
assert.expect(4);
|
|
3489
|
-
let actual = [];
|
|
3490
|
-
|
|
3491
|
-
this.router.map(function() {
|
|
3492
|
-
this.route('yondo', { path: '/' });
|
|
3493
|
-
this.route('stink-bomb');
|
|
3494
|
-
});
|
|
3495
|
-
|
|
3496
|
-
this.add(
|
|
3497
|
-
'route:yondo',
|
|
3498
|
-
Route.extend({
|
|
3499
|
-
redirect() {
|
|
3500
|
-
this.transitionTo('stink-bomb', { something: 'goes boom' });
|
|
3501
|
-
},
|
|
3502
|
-
})
|
|
3503
|
-
);
|
|
3504
|
-
|
|
3505
|
-
console.error = function() {
|
|
3506
|
-
// push the arguments onto an array so we can detect if the error gets logged twice
|
|
3507
|
-
actual.push(arguments);
|
|
3508
|
-
};
|
|
3509
|
-
|
|
3510
|
-
assert.throws(() => this.visit('/'), /More context objects were passed/);
|
|
3511
|
-
|
|
3512
|
-
assert.equal(actual.length, 1, 'the error is only logged once');
|
|
3513
|
-
assert.equal(actual[0][0], 'Error while processing route: yondo', 'source route is printed');
|
|
3514
|
-
assert.ok(
|
|
3515
|
-
actual[0][1].match(
|
|
3516
|
-
/More context objects were passed than there are dynamic segments for the route: stink-bomb/
|
|
3517
|
-
),
|
|
3518
|
-
'the error is printed'
|
|
3519
|
-
);
|
|
3520
|
-
}
|
|
3521
|
-
|
|
3522
|
-
['@test Errors in transition show error template if available'](assert) {
|
|
3523
|
-
this.addTemplate('error', "<div id='error'>Error!</div>");
|
|
3524
|
-
|
|
3525
|
-
this.router.map(function() {
|
|
3526
|
-
this.route('yondo', { path: '/' });
|
|
3527
|
-
this.route('stink-bomb');
|
|
3528
|
-
});
|
|
3529
|
-
|
|
3530
|
-
this.add(
|
|
3531
|
-
'route:yondo',
|
|
3532
|
-
Route.extend({
|
|
3533
|
-
redirect() {
|
|
3534
|
-
this.transitionTo('stink-bomb', { something: 'goes boom' });
|
|
3535
|
-
},
|
|
3536
|
-
})
|
|
3537
|
-
);
|
|
3538
|
-
console.error = () => {};
|
|
3539
|
-
|
|
3540
|
-
return this.visit('/').then(() => {
|
|
3541
|
-
let rootElement = document.querySelector('#qunit-fixture');
|
|
3542
|
-
assert.equal(
|
|
3543
|
-
rootElement.querySelectorAll('#error').length,
|
|
3544
|
-
1,
|
|
3545
|
-
'Error template was rendered.'
|
|
3546
|
-
);
|
|
3547
|
-
});
|
|
3548
|
-
}
|
|
3549
|
-
|
|
3550
|
-
['@test Route#resetController gets fired when changing models and exiting routes'](assert) {
|
|
3551
|
-
assert.expect(4);
|
|
3552
|
-
|
|
3553
|
-
this.router.map(function() {
|
|
3554
|
-
this.route('a', function() {
|
|
3555
|
-
this.route('b', { path: '/b/:id', resetNamespace: true }, function() {});
|
|
3556
|
-
this.route('c', { path: '/c/:id', resetNamespace: true }, function() {});
|
|
3557
|
-
});
|
|
3558
|
-
this.route('out');
|
|
3559
|
-
});
|
|
3560
|
-
|
|
3561
|
-
let calls = [];
|
|
3562
|
-
|
|
3563
|
-
let SpyRoute = Route.extend({
|
|
3564
|
-
setupController(/* controller, model, transition */) {
|
|
3565
|
-
calls.push(['setup', this.routeName]);
|
|
3566
|
-
},
|
|
3567
|
-
|
|
3568
|
-
resetController(/* controller */) {
|
|
3569
|
-
calls.push(['reset', this.routeName]);
|
|
3570
|
-
},
|
|
3571
|
-
});
|
|
3572
|
-
|
|
3573
|
-
this.add('route:a', SpyRoute.extend());
|
|
3574
|
-
this.add('route:b', SpyRoute.extend());
|
|
3575
|
-
this.add('route:c', SpyRoute.extend());
|
|
3576
|
-
this.add('route:out', SpyRoute.extend());
|
|
3577
|
-
|
|
3578
|
-
let router;
|
|
3579
|
-
return this.visit('/')
|
|
3580
|
-
.then(() => {
|
|
3581
|
-
router = this.applicationInstance.lookup('router:main');
|
|
3582
|
-
assert.deepEqual(calls, []);
|
|
3583
|
-
return run(router, 'transitionTo', 'b', 'b-1');
|
|
3584
|
-
})
|
|
3585
|
-
.then(() => {
|
|
3586
|
-
assert.deepEqual(calls, [['setup', 'a'], ['setup', 'b']]);
|
|
3587
|
-
calls.length = 0;
|
|
3588
|
-
return run(router, 'transitionTo', 'c', 'c-1');
|
|
3589
|
-
})
|
|
3590
|
-
.then(() => {
|
|
3591
|
-
assert.deepEqual(calls, [['reset', 'b'], ['setup', 'c']]);
|
|
3592
|
-
calls.length = 0;
|
|
3593
|
-
return run(router, 'transitionTo', 'out');
|
|
3594
|
-
})
|
|
3595
|
-
.then(() => {
|
|
3596
|
-
assert.deepEqual(calls, [['reset', 'c'], ['reset', 'a'], ['setup', 'out']]);
|
|
3597
|
-
});
|
|
3598
|
-
}
|
|
3599
|
-
|
|
3600
|
-
['@test Exception during initialization of non-initial route is not swallowed'](assert) {
|
|
3601
|
-
this.router.map(function() {
|
|
3602
|
-
this.route('boom');
|
|
3603
|
-
});
|
|
3604
|
-
this.add(
|
|
3605
|
-
'route:boom',
|
|
3606
|
-
Route.extend({
|
|
3607
|
-
init() {
|
|
3608
|
-
throw new Error('boom!');
|
|
3609
|
-
},
|
|
3610
|
-
})
|
|
3611
|
-
);
|
|
3612
|
-
|
|
3613
|
-
return assert.throws(() => this.visit('/boom'), /\bboom\b/);
|
|
3614
|
-
}
|
|
3615
|
-
|
|
3616
|
-
['@test Exception during initialization of initial route is not swallowed'](assert) {
|
|
3617
|
-
this.router.map(function() {
|
|
3618
|
-
this.route('boom', { path: '/' });
|
|
3619
|
-
});
|
|
3620
|
-
this.add(
|
|
3621
|
-
'route:boom',
|
|
3622
|
-
Route.extend({
|
|
3623
|
-
init() {
|
|
3624
|
-
throw new Error('boom!');
|
|
3625
|
-
},
|
|
3626
|
-
})
|
|
3627
|
-
);
|
|
3628
|
-
return assert.throws(() => this.visit('/'), /\bboom\b/);
|
|
3629
|
-
}
|
|
3630
|
-
|
|
3631
|
-
['@test {{outlet}} works when created after initial render'](assert) {
|
|
3632
|
-
this.addTemplate('sample', 'Hi{{#if showTheThing}}{{outlet}}{{/if}}Bye');
|
|
3633
|
-
this.addTemplate('sample.inner', 'Yay');
|
|
3634
|
-
this.addTemplate('sample.inner2', 'Boo');
|
|
3635
|
-
this.router.map(function() {
|
|
3636
|
-
this.route('sample', { path: '/' }, function() {
|
|
3637
|
-
this.route('inner', { path: '/' });
|
|
3638
|
-
this.route('inner2', { path: '/2' });
|
|
3639
|
-
});
|
|
3640
|
-
});
|
|
3641
|
-
|
|
3642
|
-
let rootElement;
|
|
3643
|
-
return this.visit('/')
|
|
3644
|
-
.then(() => {
|
|
3645
|
-
rootElement = document.getElementById('qunit-fixture');
|
|
3646
|
-
assert.equal(rootElement.textContent.trim(), 'HiBye', 'initial render');
|
|
3647
|
-
|
|
3648
|
-
run(() => this.applicationInstance.lookup('controller:sample').set('showTheThing', true));
|
|
3649
|
-
|
|
3650
|
-
assert.equal(rootElement.textContent.trim(), 'HiYayBye', 'second render');
|
|
3651
|
-
return this.visit('/2');
|
|
3652
|
-
})
|
|
3653
|
-
.then(() => {
|
|
3654
|
-
assert.equal(rootElement.textContent.trim(), 'HiBooBye', 'third render');
|
|
3655
|
-
});
|
|
3656
|
-
}
|
|
3657
|
-
|
|
3658
|
-
['@test Can render into a named outlet at the top level'](assert) {
|
|
3659
|
-
this.addTemplate('application', 'A-{{outlet}}-B-{{outlet "other"}}-C');
|
|
3660
|
-
this.addTemplate('modal', 'Hello world');
|
|
3661
|
-
this.addTemplate('index', 'The index');
|
|
3662
|
-
this.router.map(function() {
|
|
3663
|
-
this.route('index', { path: '/' });
|
|
3664
|
-
});
|
|
3665
|
-
this.add(
|
|
3666
|
-
'route:application',
|
|
3667
|
-
Route.extend({
|
|
3668
|
-
renderTemplate() {
|
|
3669
|
-
this.render();
|
|
3670
|
-
this.render('modal', {
|
|
3671
|
-
into: 'application',
|
|
3672
|
-
outlet: 'other',
|
|
3673
|
-
});
|
|
3674
|
-
},
|
|
3675
|
-
})
|
|
3676
|
-
);
|
|
3677
|
-
|
|
3678
|
-
return this.visit('/').then(() => {
|
|
3679
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
3680
|
-
assert.equal(
|
|
3681
|
-
rootElement.textContent.trim(),
|
|
3682
|
-
'A-The index-B-Hello world-C',
|
|
3683
|
-
'initial render'
|
|
3684
|
-
);
|
|
3685
|
-
});
|
|
3686
|
-
}
|
|
3687
|
-
|
|
3688
|
-
['@test Can disconnect a named outlet at the top level'](assert) {
|
|
3689
|
-
this.addTemplate('application', 'A-{{outlet}}-B-{{outlet "other"}}-C');
|
|
3690
|
-
this.addTemplate('modal', 'Hello world');
|
|
3691
|
-
this.addTemplate('index', 'The index');
|
|
3692
|
-
this.router.map(function() {
|
|
3693
|
-
this.route('index', { path: '/' });
|
|
3694
|
-
});
|
|
3695
|
-
this.add(
|
|
3696
|
-
'route:application',
|
|
3697
|
-
Route.extend({
|
|
3698
|
-
renderTemplate() {
|
|
3699
|
-
this.render();
|
|
3700
|
-
this.render('modal', {
|
|
3701
|
-
into: 'application',
|
|
3702
|
-
outlet: 'other',
|
|
3703
|
-
});
|
|
3704
|
-
},
|
|
3705
|
-
actions: {
|
|
3706
|
-
banish() {
|
|
3707
|
-
this.disconnectOutlet({
|
|
3708
|
-
parentView: 'application',
|
|
3709
|
-
outlet: 'other',
|
|
3710
|
-
});
|
|
3711
|
-
},
|
|
3712
|
-
},
|
|
3713
|
-
})
|
|
3714
|
-
);
|
|
3715
|
-
|
|
3716
|
-
return this.visit('/').then(() => {
|
|
3717
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
3718
|
-
assert.equal(
|
|
3719
|
-
rootElement.textContent.trim(),
|
|
3720
|
-
'A-The index-B-Hello world-C',
|
|
3721
|
-
'initial render'
|
|
3722
|
-
);
|
|
3723
|
-
|
|
3724
|
-
run(this.applicationInstance.lookup('router:main'), 'send', 'banish');
|
|
3725
|
-
|
|
3726
|
-
assert.equal(rootElement.textContent.trim(), 'A-The index-B--C', 'second render');
|
|
3727
|
-
});
|
|
3728
|
-
}
|
|
3729
|
-
|
|
3730
|
-
['@test Can render into a named outlet at the top level, with empty main outlet'](assert) {
|
|
3731
|
-
this.addTemplate('application', 'A-{{outlet}}-B-{{outlet "other"}}-C');
|
|
3732
|
-
this.addTemplate('modal', 'Hello world');
|
|
3733
|
-
|
|
3734
|
-
this.router.map(function() {
|
|
3735
|
-
this.route('hasNoTemplate', { path: '/' });
|
|
3736
|
-
});
|
|
3737
|
-
|
|
3738
|
-
this.add(
|
|
3739
|
-
'route:application',
|
|
3740
|
-
Route.extend({
|
|
3741
|
-
renderTemplate() {
|
|
3742
|
-
this.render();
|
|
3743
|
-
this.render('modal', {
|
|
3744
|
-
into: 'application',
|
|
3745
|
-
outlet: 'other',
|
|
3746
|
-
});
|
|
3747
|
-
},
|
|
3748
|
-
})
|
|
3749
|
-
);
|
|
3750
|
-
|
|
3751
|
-
return this.visit('/').then(() => {
|
|
3752
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
3753
|
-
assert.equal(rootElement.textContent.trim(), 'A--B-Hello world-C', 'initial render');
|
|
3754
|
-
});
|
|
3755
|
-
}
|
|
3756
|
-
|
|
3757
|
-
['@test Can render into a named outlet at the top level, later'](assert) {
|
|
3758
|
-
this.addTemplate('application', 'A-{{outlet}}-B-{{outlet "other"}}-C');
|
|
3759
|
-
this.addTemplate('modal', 'Hello world');
|
|
3760
|
-
this.addTemplate('index', 'The index');
|
|
3761
|
-
this.router.map(function() {
|
|
3762
|
-
this.route('index', { path: '/' });
|
|
3763
|
-
});
|
|
3764
|
-
this.add(
|
|
3765
|
-
'route:application',
|
|
3766
|
-
Route.extend({
|
|
3767
|
-
actions: {
|
|
3768
|
-
launch() {
|
|
3769
|
-
this.render('modal', {
|
|
3770
|
-
into: 'application',
|
|
3771
|
-
outlet: 'other',
|
|
3772
|
-
});
|
|
3773
|
-
},
|
|
3774
|
-
},
|
|
3775
|
-
})
|
|
3776
|
-
);
|
|
3777
|
-
|
|
3778
|
-
return this.visit('/').then(() => {
|
|
3779
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
3780
|
-
assert.equal(rootElement.textContent.trim(), 'A-The index-B--C', 'initial render');
|
|
3781
|
-
run(this.applicationInstance.lookup('router:main'), 'send', 'launch');
|
|
3782
|
-
assert.equal(
|
|
3783
|
-
rootElement.textContent.trim(),
|
|
3784
|
-
'A-The index-B-Hello world-C',
|
|
3785
|
-
'second render'
|
|
3786
|
-
);
|
|
3787
|
-
});
|
|
3788
|
-
}
|
|
3789
|
-
|
|
3790
|
-
["@test Can render routes with no 'main' outlet and their children"](assert) {
|
|
3791
|
-
this.addTemplate('application', '<div id="application">{{outlet "app"}}</div>');
|
|
3792
|
-
this.addTemplate(
|
|
3793
|
-
'app',
|
|
3794
|
-
'<div id="app-common">{{outlet "common"}}</div><div id="app-sub">{{outlet "sub"}}</div>'
|
|
3795
|
-
);
|
|
3796
|
-
this.addTemplate('common', '<div id="common"></div>');
|
|
3797
|
-
this.addTemplate('sub', '<div id="sub"></div>');
|
|
3798
|
-
|
|
3799
|
-
this.router.map(function() {
|
|
3800
|
-
this.route('app', { path: '/app' }, function() {
|
|
3801
|
-
this.route('sub', { path: '/sub', resetNamespace: true });
|
|
3802
|
-
});
|
|
3803
|
-
});
|
|
3804
|
-
|
|
3805
|
-
this.add(
|
|
3806
|
-
'route:app',
|
|
3807
|
-
Route.extend({
|
|
3808
|
-
renderTemplate() {
|
|
3809
|
-
this.render('app', {
|
|
3810
|
-
outlet: 'app',
|
|
3811
|
-
into: 'application',
|
|
3812
|
-
});
|
|
3813
|
-
this.render('common', {
|
|
3814
|
-
outlet: 'common',
|
|
3815
|
-
into: 'app',
|
|
3816
|
-
});
|
|
3817
|
-
},
|
|
3818
|
-
})
|
|
3819
|
-
);
|
|
3820
|
-
|
|
3821
|
-
this.add(
|
|
3822
|
-
'route:sub',
|
|
3823
|
-
Route.extend({
|
|
3824
|
-
renderTemplate() {
|
|
3825
|
-
this.render('sub', {
|
|
3826
|
-
outlet: 'sub',
|
|
3827
|
-
into: 'app',
|
|
3828
|
-
});
|
|
3829
|
-
},
|
|
3830
|
-
})
|
|
3831
|
-
);
|
|
3832
|
-
|
|
3833
|
-
let rootElement;
|
|
3834
|
-
return this.visit('/app')
|
|
3835
|
-
.then(() => {
|
|
3836
|
-
rootElement = document.getElementById('qunit-fixture');
|
|
3837
|
-
assert.equal(
|
|
3838
|
-
rootElement.querySelectorAll('#app-common #common').length,
|
|
3839
|
-
1,
|
|
3840
|
-
'Finds common while viewing /app'
|
|
3841
|
-
);
|
|
3842
|
-
return this.visit('/app/sub');
|
|
3843
|
-
})
|
|
3844
|
-
.then(() => {
|
|
3845
|
-
assert.equal(
|
|
3846
|
-
rootElement.querySelectorAll('#app-common #common').length,
|
|
3847
|
-
1,
|
|
3848
|
-
'Finds common while viewing /app/sub'
|
|
3849
|
-
);
|
|
3850
|
-
assert.equal(
|
|
3851
|
-
rootElement.querySelectorAll('#app-sub #sub').length,
|
|
3852
|
-
1,
|
|
3853
|
-
'Finds sub while viewing /app/sub'
|
|
3854
|
-
);
|
|
3855
|
-
});
|
|
3856
|
-
}
|
|
3857
|
-
|
|
3858
|
-
['@test Tolerates stacked renders'](assert) {
|
|
3859
|
-
this.addTemplate('application', '{{outlet}}{{outlet "modal"}}');
|
|
3860
|
-
this.addTemplate('index', 'hi');
|
|
3861
|
-
this.addTemplate('layer', 'layer');
|
|
3862
|
-
this.router.map(function() {
|
|
3863
|
-
this.route('index', { path: '/' });
|
|
3864
|
-
});
|
|
3865
|
-
this.add(
|
|
3866
|
-
'route:application',
|
|
3867
|
-
Route.extend({
|
|
3868
|
-
actions: {
|
|
3869
|
-
openLayer() {
|
|
3870
|
-
this.render('layer', {
|
|
3871
|
-
into: 'application',
|
|
3872
|
-
outlet: 'modal',
|
|
3873
|
-
});
|
|
3874
|
-
},
|
|
3875
|
-
close() {
|
|
3876
|
-
this.disconnectOutlet({
|
|
3877
|
-
outlet: 'modal',
|
|
3878
|
-
parentView: 'application',
|
|
3879
|
-
});
|
|
3880
|
-
},
|
|
3881
|
-
},
|
|
3882
|
-
})
|
|
3883
|
-
);
|
|
3884
|
-
|
|
3885
|
-
return this.visit('/').then(() => {
|
|
3886
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
3887
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
3888
|
-
assert.equal(rootElement.textContent.trim(), 'hi');
|
|
3889
|
-
run(router, 'send', 'openLayer');
|
|
3890
|
-
assert.equal(rootElement.textContent.trim(), 'hilayer');
|
|
3891
|
-
run(router, 'send', 'openLayer');
|
|
3892
|
-
assert.equal(rootElement.textContent.trim(), 'hilayer');
|
|
3893
|
-
run(router, 'send', 'close');
|
|
3894
|
-
assert.equal(rootElement.textContent.trim(), 'hi');
|
|
3895
|
-
});
|
|
3896
|
-
}
|
|
3897
|
-
|
|
3898
|
-
['@test Renders child into parent with non-default template name'](assert) {
|
|
3899
|
-
this.addTemplate('application', '<div class="a">{{outlet}}</div>');
|
|
3900
|
-
this.addTemplate('exports.root', '<div class="b">{{outlet}}</div>');
|
|
3901
|
-
this.addTemplate('exports.index', '<div class="c"></div>');
|
|
3902
|
-
|
|
3903
|
-
this.router.map(function() {
|
|
3904
|
-
this.route('root', function() {});
|
|
3905
|
-
});
|
|
3906
|
-
|
|
3907
|
-
this.add(
|
|
3908
|
-
'route:root',
|
|
3909
|
-
Route.extend({
|
|
3910
|
-
renderTemplate() {
|
|
3911
|
-
this.render('exports/root');
|
|
3912
|
-
},
|
|
3913
|
-
})
|
|
3914
|
-
);
|
|
3915
|
-
|
|
3916
|
-
this.add(
|
|
3917
|
-
'route:root.index',
|
|
3918
|
-
Route.extend({
|
|
3919
|
-
renderTemplate() {
|
|
3920
|
-
this.render('exports/index');
|
|
3921
|
-
},
|
|
3922
|
-
})
|
|
3923
|
-
);
|
|
3924
|
-
|
|
3925
|
-
return this.visit('/root').then(() => {
|
|
3926
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
3927
|
-
assert.equal(rootElement.querySelectorAll('.a .b .c').length, 1);
|
|
3928
|
-
});
|
|
3929
|
-
}
|
|
3930
|
-
|
|
3931
|
-
["@test Allows any route to disconnectOutlet another route's templates"](assert) {
|
|
3932
|
-
this.addTemplate('application', '{{outlet}}{{outlet "modal"}}');
|
|
3933
|
-
this.addTemplate('index', 'hi');
|
|
3934
|
-
this.addTemplate('layer', 'layer');
|
|
3935
|
-
this.router.map(function() {
|
|
3936
|
-
this.route('index', { path: '/' });
|
|
3937
|
-
});
|
|
3938
|
-
this.add(
|
|
3939
|
-
'route:application',
|
|
3940
|
-
Route.extend({
|
|
3941
|
-
actions: {
|
|
3942
|
-
openLayer() {
|
|
3943
|
-
this.render('layer', {
|
|
3944
|
-
into: 'application',
|
|
3945
|
-
outlet: 'modal',
|
|
3946
|
-
});
|
|
3947
|
-
},
|
|
3948
|
-
},
|
|
3949
|
-
})
|
|
3950
|
-
);
|
|
3951
|
-
this.add(
|
|
3952
|
-
'route:index',
|
|
3953
|
-
Route.extend({
|
|
3954
|
-
actions: {
|
|
3955
|
-
close() {
|
|
3956
|
-
this.disconnectOutlet({
|
|
3957
|
-
parentView: 'application',
|
|
3958
|
-
outlet: 'modal',
|
|
3959
|
-
});
|
|
3960
|
-
},
|
|
3961
|
-
},
|
|
3962
|
-
})
|
|
3963
|
-
);
|
|
3964
|
-
|
|
3965
|
-
return this.visit('/').then(() => {
|
|
3966
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
3967
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
3968
|
-
assert.equal(rootElement.textContent.trim(), 'hi');
|
|
3969
|
-
run(router, 'send', 'openLayer');
|
|
3970
|
-
assert.equal(rootElement.textContent.trim(), 'hilayer');
|
|
3971
|
-
run(router, 'send', 'close');
|
|
3972
|
-
assert.equal(rootElement.textContent.trim(), 'hi');
|
|
3973
|
-
});
|
|
3974
|
-
}
|
|
3975
|
-
|
|
3976
|
-
['@test Can this.render({into:...}) the render helper'](assert) {
|
|
3977
|
-
expectDeprecation(
|
|
3978
|
-
/Rendering into a {{render}} helper that resolves to an {{outlet}} is deprecated./
|
|
3979
|
-
);
|
|
3980
|
-
|
|
3981
|
-
expectDeprecation(() => {
|
|
3982
|
-
this.addTemplate('application', '{{render "sidebar"}}');
|
|
3983
|
-
}, /Please refactor [\w\{\}"` ]+ to a component/);
|
|
3984
|
-
this.router.map(function() {
|
|
3985
|
-
this.route('index', { path: '/' });
|
|
3986
|
-
});
|
|
3987
|
-
this.addTemplate('sidebar', '<div class="sidebar">{{outlet}}</div>');
|
|
3988
|
-
this.addTemplate('index', 'other');
|
|
3989
|
-
this.addTemplate('bar', 'bar');
|
|
3990
|
-
|
|
3991
|
-
this.add(
|
|
3992
|
-
'route:index',
|
|
3993
|
-
Route.extend({
|
|
3994
|
-
renderTemplate() {
|
|
3995
|
-
this.render({ into: 'sidebar' });
|
|
3996
|
-
},
|
|
3997
|
-
actions: {
|
|
3998
|
-
changeToBar() {
|
|
3999
|
-
this.disconnectOutlet({
|
|
4000
|
-
parentView: 'sidebar',
|
|
4001
|
-
outlet: 'main',
|
|
4002
|
-
});
|
|
4003
|
-
this.render('bar', { into: 'sidebar' });
|
|
4004
|
-
},
|
|
4005
|
-
},
|
|
4006
|
-
})
|
|
4007
|
-
);
|
|
4008
|
-
|
|
4009
|
-
return this.visit('/').then(() => {
|
|
4010
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
4011
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
4012
|
-
assert.equal(getTextOf(rootElement.querySelector('.sidebar')), 'other');
|
|
4013
|
-
run(router, 'send', 'changeToBar');
|
|
4014
|
-
assert.equal(getTextOf(rootElement.querySelector('.sidebar')), 'bar');
|
|
4015
|
-
});
|
|
4016
|
-
}
|
|
4017
|
-
|
|
4018
|
-
['@test Can disconnect from the render helper'](assert) {
|
|
4019
|
-
expectDeprecation(
|
|
4020
|
-
/Rendering into a {{render}} helper that resolves to an {{outlet}} is deprecated./
|
|
4021
|
-
);
|
|
4022
|
-
|
|
4023
|
-
expectDeprecation(() => {
|
|
4024
|
-
this.addTemplate('application', '{{render "sidebar"}}');
|
|
4025
|
-
}, /Please refactor [\w\{\}"` ]+ to a component/);
|
|
4026
|
-
this.router.map(function() {
|
|
4027
|
-
this.route('index', { path: '/' });
|
|
4028
|
-
});
|
|
4029
|
-
this.addTemplate('sidebar', '<div class="sidebar">{{outlet}}</div>');
|
|
4030
|
-
this.addTemplate('index', 'other');
|
|
4031
|
-
|
|
4032
|
-
this.add(
|
|
4033
|
-
'route:index',
|
|
4034
|
-
Route.extend({
|
|
4035
|
-
renderTemplate() {
|
|
4036
|
-
this.render({ into: 'sidebar' });
|
|
4037
|
-
},
|
|
4038
|
-
actions: {
|
|
4039
|
-
disconnect: function() {
|
|
4040
|
-
this.disconnectOutlet({
|
|
4041
|
-
parentView: 'sidebar',
|
|
4042
|
-
outlet: 'main',
|
|
4043
|
-
});
|
|
4044
|
-
},
|
|
4045
|
-
},
|
|
4046
|
-
})
|
|
4047
|
-
);
|
|
4048
|
-
|
|
4049
|
-
return this.visit('/').then(() => {
|
|
4050
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
4051
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
4052
|
-
assert.equal(getTextOf(rootElement.querySelector('.sidebar')), 'other');
|
|
4053
|
-
run(router, 'send', 'disconnect');
|
|
4054
|
-
assert.equal(getTextOf(rootElement.querySelector('.sidebar')), '');
|
|
4055
|
-
});
|
|
4056
|
-
}
|
|
4057
|
-
|
|
4058
|
-
["@test Can this.render({into:...}) the render helper's children"](assert) {
|
|
4059
|
-
expectDeprecation(
|
|
4060
|
-
/Rendering into a {{render}} helper that resolves to an {{outlet}} is deprecated./
|
|
4061
|
-
);
|
|
4062
|
-
|
|
4063
|
-
expectDeprecation(() => {
|
|
4064
|
-
this.addTemplate('application', '{{render "sidebar"}}');
|
|
4065
|
-
}, /Please refactor [\w\{\}"` ]+ to a component/);
|
|
4066
|
-
|
|
4067
|
-
this.addTemplate('sidebar', '<div class="sidebar">{{outlet}}</div>');
|
|
4068
|
-
this.addTemplate('index', '<div class="index">{{outlet}}</div>');
|
|
4069
|
-
this.addTemplate('other', 'other');
|
|
4070
|
-
this.addTemplate('bar', 'bar');
|
|
4071
|
-
this.router.map(function() {
|
|
4072
|
-
this.route('index', { path: '/' });
|
|
4073
|
-
});
|
|
4074
|
-
this.add(
|
|
4075
|
-
'route:index',
|
|
4076
|
-
Route.extend({
|
|
4077
|
-
renderTemplate() {
|
|
4078
|
-
this.render({ into: 'sidebar' });
|
|
4079
|
-
this.render('other', { into: 'index' });
|
|
4080
|
-
},
|
|
4081
|
-
actions: {
|
|
4082
|
-
changeToBar() {
|
|
4083
|
-
this.disconnectOutlet({
|
|
4084
|
-
parentView: 'index',
|
|
4085
|
-
outlet: 'main',
|
|
4086
|
-
});
|
|
4087
|
-
this.render('bar', { into: 'index' });
|
|
4088
|
-
},
|
|
4089
|
-
},
|
|
4090
|
-
})
|
|
4091
|
-
);
|
|
4092
|
-
|
|
4093
|
-
return this.visit('/').then(() => {
|
|
4094
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
4095
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
4096
|
-
assert.equal(getTextOf(rootElement.querySelector('.sidebar .index')), 'other');
|
|
4097
|
-
run(router, 'send', 'changeToBar');
|
|
4098
|
-
assert.equal(getTextOf(rootElement.querySelector('.sidebar .index')), 'bar');
|
|
4099
|
-
});
|
|
4100
|
-
}
|
|
4101
|
-
|
|
4102
|
-
["@test Can disconnect from the render helper's children"](assert) {
|
|
4103
|
-
expectDeprecation(
|
|
4104
|
-
/Rendering into a {{render}} helper that resolves to an {{outlet}} is deprecated./
|
|
4105
|
-
);
|
|
4106
|
-
|
|
4107
|
-
expectDeprecation(() => {
|
|
4108
|
-
this.addTemplate('application', '{{render "sidebar"}}');
|
|
4109
|
-
}, /Please refactor [\w\{\}"` ]+ to a component/);
|
|
4110
|
-
this.router.map(function() {
|
|
4111
|
-
this.route('index', { path: '/' });
|
|
4112
|
-
});
|
|
4113
|
-
this.addTemplate('sidebar', '<div class="sidebar">{{outlet}}</div>');
|
|
4114
|
-
this.addTemplate('index', '<div class="index">{{outlet}}</div>');
|
|
4115
|
-
this.addTemplate('other', 'other');
|
|
4116
|
-
|
|
4117
|
-
this.add(
|
|
4118
|
-
'route:index',
|
|
4119
|
-
Route.extend({
|
|
4120
|
-
renderTemplate() {
|
|
4121
|
-
this.render({ into: 'sidebar' });
|
|
4122
|
-
this.render('other', { into: 'index' });
|
|
4123
|
-
},
|
|
4124
|
-
actions: {
|
|
4125
|
-
disconnect() {
|
|
4126
|
-
this.disconnectOutlet({
|
|
4127
|
-
parentView: 'index',
|
|
4128
|
-
outlet: 'main',
|
|
4129
|
-
});
|
|
4130
|
-
},
|
|
4131
|
-
},
|
|
4132
|
-
})
|
|
4133
|
-
);
|
|
4134
|
-
|
|
4135
|
-
return this.visit('/').then(() => {
|
|
4136
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
4137
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
4138
|
-
assert.equal(getTextOf(rootElement.querySelector('.sidebar .index')), 'other');
|
|
4139
|
-
run(router, 'send', 'disconnect');
|
|
4140
|
-
assert.equal(getTextOf(rootElement.querySelector('.sidebar .index')), '');
|
|
4141
|
-
});
|
|
4142
|
-
}
|
|
4143
|
-
|
|
4144
|
-
['@test Can this.render({into:...}) nested render helpers'](assert) {
|
|
4145
|
-
expectDeprecation(
|
|
4146
|
-
/Rendering into a {{render}} helper that resolves to an {{outlet}} is deprecated./
|
|
4147
|
-
);
|
|
4148
|
-
|
|
4149
|
-
expectDeprecation(() => {
|
|
4150
|
-
this.addTemplate('application', '{{render "sidebar"}}');
|
|
4151
|
-
}, /Please refactor [\w\{\}"` ]+ to a component/);
|
|
4152
|
-
|
|
4153
|
-
expectDeprecation(() => {
|
|
4154
|
-
this.addTemplate('sidebar', '<div class="sidebar">{{render "cart"}}</div>');
|
|
4155
|
-
}, /Please refactor [\w\{\}"` ]+ to a component/);
|
|
4156
|
-
this.router.map(function() {
|
|
4157
|
-
this.route('index', { path: '/' });
|
|
4158
|
-
});
|
|
4159
|
-
this.addTemplate('cart', '<div class="cart">{{outlet}}</div>');
|
|
4160
|
-
this.addTemplate('index', 'other');
|
|
4161
|
-
this.addTemplate('baz', 'baz');
|
|
4162
|
-
|
|
4163
|
-
this.add(
|
|
4164
|
-
'route:index',
|
|
4165
|
-
Route.extend({
|
|
4166
|
-
renderTemplate() {
|
|
4167
|
-
this.render({ into: 'cart' });
|
|
4168
|
-
},
|
|
4169
|
-
actions: {
|
|
4170
|
-
changeToBaz() {
|
|
4171
|
-
this.disconnectOutlet({
|
|
4172
|
-
parentView: 'cart',
|
|
4173
|
-
outlet: 'main',
|
|
4174
|
-
});
|
|
4175
|
-
this.render('baz', { into: 'cart' });
|
|
4176
|
-
},
|
|
4177
|
-
},
|
|
4178
|
-
})
|
|
4179
|
-
);
|
|
4180
|
-
|
|
4181
|
-
return this.visit('/').then(() => {
|
|
4182
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
4183
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
4184
|
-
assert.equal(getTextOf(rootElement.querySelector('.cart')), 'other');
|
|
4185
|
-
run(router, 'send', 'changeToBaz');
|
|
4186
|
-
assert.equal(getTextOf(rootElement.querySelector('.cart')), 'baz');
|
|
4187
|
-
});
|
|
4188
|
-
}
|
|
4189
|
-
|
|
4190
|
-
['@test Can disconnect from nested render helpers'](assert) {
|
|
4191
|
-
expectDeprecation(
|
|
4192
|
-
/Rendering into a {{render}} helper that resolves to an {{outlet}} is deprecated./
|
|
4193
|
-
);
|
|
4194
|
-
|
|
4195
|
-
expectDeprecation(() => {
|
|
4196
|
-
this.addTemplate('application', '{{render "sidebar"}}');
|
|
4197
|
-
}, /Please refactor [\w\{\}"` ]+ to a component/);
|
|
4198
|
-
|
|
4199
|
-
expectDeprecation(() => {
|
|
4200
|
-
this.addTemplate('sidebar', '<div class="sidebar">{{render "cart"}}</div>');
|
|
4201
|
-
}, /Please refactor [\w\{\}"` ]+ to a component/);
|
|
4202
|
-
this.router.map(function() {
|
|
4203
|
-
this.route('index', { path: '/' });
|
|
4204
|
-
});
|
|
4205
|
-
this.addTemplate('cart', '<div class="cart">{{outlet}}</div>');
|
|
4206
|
-
this.addTemplate('index', 'other');
|
|
4207
|
-
|
|
4208
|
-
this.add(
|
|
4209
|
-
'route:index',
|
|
4210
|
-
Route.extend({
|
|
4211
|
-
renderTemplate() {
|
|
4212
|
-
this.render({ into: 'cart' });
|
|
4213
|
-
},
|
|
4214
|
-
actions: {
|
|
4215
|
-
disconnect() {
|
|
4216
|
-
this.disconnectOutlet({
|
|
4217
|
-
parentView: 'cart',
|
|
4218
|
-
outlet: 'main',
|
|
4219
|
-
});
|
|
4220
|
-
},
|
|
4221
|
-
},
|
|
4222
|
-
})
|
|
4223
|
-
);
|
|
4224
|
-
|
|
4225
|
-
return this.visit('/').then(() => {
|
|
4226
|
-
let rootElement = document.getElementById('qunit-fixture');
|
|
4227
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
4228
|
-
assert.equal(getTextOf(rootElement.querySelector('.cart')), 'other');
|
|
4229
|
-
run(router, 'send', 'disconnect');
|
|
4230
|
-
assert.equal(getTextOf(rootElement.querySelector('.cart')), '');
|
|
4231
|
-
});
|
|
4232
|
-
}
|
|
4233
|
-
|
|
4234
|
-
['@test Components inside an outlet have their didInsertElement hook invoked when the route is displayed'](
|
|
4235
|
-
assert
|
|
4236
|
-
) {
|
|
4237
|
-
this.addTemplate(
|
|
4238
|
-
'index',
|
|
4239
|
-
'{{#if showFirst}}{{my-component}}{{else}}{{other-component}}{{/if}}'
|
|
4240
|
-
);
|
|
4241
|
-
|
|
4242
|
-
let myComponentCounter = 0;
|
|
4243
|
-
let otherComponentCounter = 0;
|
|
4244
|
-
let indexController;
|
|
4245
|
-
|
|
4246
|
-
this.router.map(function() {
|
|
4247
|
-
this.route('index', { path: '/' });
|
|
4248
|
-
});
|
|
4249
|
-
|
|
4250
|
-
this.add(
|
|
4251
|
-
'controller:index',
|
|
4252
|
-
Controller.extend({
|
|
4253
|
-
showFirst: true,
|
|
4254
|
-
})
|
|
4255
|
-
);
|
|
4256
|
-
|
|
4257
|
-
this.add(
|
|
4258
|
-
'route:index',
|
|
4259
|
-
Route.extend({
|
|
4260
|
-
setupController(controller) {
|
|
4261
|
-
indexController = controller;
|
|
4262
|
-
},
|
|
4263
|
-
})
|
|
4264
|
-
);
|
|
4265
|
-
|
|
4266
|
-
this.add(
|
|
4267
|
-
'component:my-component',
|
|
4268
|
-
Component.extend({
|
|
4269
|
-
didInsertElement() {
|
|
4270
|
-
myComponentCounter++;
|
|
4271
|
-
},
|
|
4272
|
-
})
|
|
4273
|
-
);
|
|
4274
|
-
|
|
4275
|
-
this.add(
|
|
4276
|
-
'component:other-component',
|
|
4277
|
-
Component.extend({
|
|
4278
|
-
didInsertElement() {
|
|
4279
|
-
otherComponentCounter++;
|
|
4280
|
-
},
|
|
4281
|
-
})
|
|
4282
|
-
);
|
|
4283
|
-
|
|
4284
|
-
return this.visit('/').then(() => {
|
|
4285
|
-
assert.strictEqual(
|
|
4286
|
-
myComponentCounter,
|
|
4287
|
-
1,
|
|
4288
|
-
'didInsertElement invoked on displayed component'
|
|
4289
|
-
);
|
|
4290
|
-
assert.strictEqual(
|
|
4291
|
-
otherComponentCounter,
|
|
4292
|
-
0,
|
|
4293
|
-
'didInsertElement not invoked on displayed component'
|
|
4294
|
-
);
|
|
4295
|
-
|
|
4296
|
-
run(() => indexController.set('showFirst', false));
|
|
4297
|
-
|
|
4298
|
-
assert.strictEqual(
|
|
4299
|
-
myComponentCounter,
|
|
4300
|
-
1,
|
|
4301
|
-
'didInsertElement not invoked on displayed component'
|
|
4302
|
-
);
|
|
4303
|
-
assert.strictEqual(
|
|
4304
|
-
otherComponentCounter,
|
|
4305
|
-
1,
|
|
4306
|
-
'didInsertElement invoked on displayed component'
|
|
4307
|
-
);
|
|
4308
|
-
});
|
|
4309
|
-
}
|
|
4310
|
-
|
|
4311
|
-
['@test Doesnt swallow exception thrown from willTransition'](assert) {
|
|
4312
|
-
assert.expect(1);
|
|
4313
|
-
this.addTemplate('application', '{{outlet}}');
|
|
4314
|
-
this.addTemplate('index', 'index');
|
|
4315
|
-
this.addTemplate('other', 'other');
|
|
4316
|
-
|
|
4317
|
-
this.router.map(function() {
|
|
4318
|
-
this.route('index', { path: '/' });
|
|
4319
|
-
this.route('other', function() {});
|
|
4320
|
-
});
|
|
4321
|
-
|
|
4322
|
-
this.add(
|
|
4323
|
-
'route:index',
|
|
4324
|
-
Route.extend({
|
|
4325
|
-
actions: {
|
|
4326
|
-
willTransition() {
|
|
4327
|
-
throw new Error('boom');
|
|
4328
|
-
},
|
|
4329
|
-
},
|
|
4330
|
-
})
|
|
4331
|
-
);
|
|
4332
|
-
|
|
4333
|
-
return this.visit('/').then(() => {
|
|
4334
|
-
return assert.throws(
|
|
4335
|
-
() => {
|
|
4336
|
-
return this.visit('/other');
|
|
4337
|
-
},
|
|
4338
|
-
/boom/,
|
|
4339
|
-
'expected an exception but none was thrown'
|
|
4340
|
-
);
|
|
4341
|
-
});
|
|
4342
|
-
}
|
|
4343
|
-
|
|
4344
|
-
['@test Exception if outlet name is undefined in render and disconnectOutlet']() {
|
|
4345
|
-
this.add(
|
|
4346
|
-
'route:application',
|
|
4347
|
-
Route.extend({
|
|
4348
|
-
actions: {
|
|
4349
|
-
showModal() {
|
|
4350
|
-
this.render({
|
|
4351
|
-
outlet: undefined,
|
|
4352
|
-
parentView: 'application',
|
|
4353
|
-
});
|
|
4354
|
-
},
|
|
4355
|
-
hideModal() {
|
|
4356
|
-
this.disconnectOutlet({
|
|
4357
|
-
outlet: undefined,
|
|
4358
|
-
parentView: 'application',
|
|
4359
|
-
});
|
|
4360
|
-
},
|
|
4361
|
-
},
|
|
4362
|
-
})
|
|
4363
|
-
);
|
|
4364
|
-
|
|
4365
|
-
return this.visit('/').then(() => {
|
|
4366
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
4367
|
-
expectAssertion(() => {
|
|
4368
|
-
run(() => router.send('showModal'));
|
|
4369
|
-
}, /You passed undefined as the outlet name/);
|
|
4370
|
-
|
|
4371
|
-
expectAssertion(() => {
|
|
4372
|
-
run(() => router.send('hideModal'));
|
|
4373
|
-
}, /You passed undefined as the outlet name/);
|
|
4374
|
-
});
|
|
4375
|
-
}
|
|
4376
|
-
|
|
4377
|
-
['@test Route serializers work for Engines'](assert) {
|
|
4378
|
-
assert.expect(2);
|
|
4379
|
-
|
|
4380
|
-
// Register engine
|
|
4381
|
-
let BlogEngine = Engine.extend();
|
|
4382
|
-
this.add('engine:blog', BlogEngine);
|
|
4383
|
-
|
|
4384
|
-
// Register engine route map
|
|
4385
|
-
let postSerialize = function(params) {
|
|
4386
|
-
assert.ok(true, 'serialize hook runs');
|
|
4387
|
-
return {
|
|
4388
|
-
post_id: params.id,
|
|
4389
|
-
};
|
|
4390
|
-
};
|
|
4391
|
-
let BlogMap = function() {
|
|
4392
|
-
this.route('post', {
|
|
4393
|
-
path: '/post/:post_id',
|
|
4394
|
-
serialize: postSerialize,
|
|
4395
|
-
});
|
|
4396
|
-
};
|
|
4397
|
-
this.add('route-map:blog', BlogMap);
|
|
4398
|
-
|
|
4399
|
-
this.router.map(function() {
|
|
4400
|
-
this.mount('blog');
|
|
4401
|
-
});
|
|
4402
|
-
|
|
4403
|
-
return this.visit('/').then(() => {
|
|
4404
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
4405
|
-
assert.equal(
|
|
4406
|
-
router._routerMicrolib.generate('blog.post', { id: '13' }),
|
|
4407
|
-
'/blog/post/13',
|
|
4408
|
-
'url is generated properly'
|
|
4409
|
-
);
|
|
4410
|
-
});
|
|
4411
|
-
}
|
|
4412
|
-
|
|
4413
|
-
['@test Defining a Route#serialize method in an Engine throws an error'](assert) {
|
|
4414
|
-
assert.expect(1);
|
|
4415
|
-
|
|
4416
|
-
// Register engine
|
|
4417
|
-
let BlogEngine = Engine.extend();
|
|
4418
|
-
this.add('engine:blog', BlogEngine);
|
|
4419
|
-
|
|
4420
|
-
// Register engine route map
|
|
4421
|
-
let BlogMap = function() {
|
|
4422
|
-
this.route('post');
|
|
4423
|
-
};
|
|
4424
|
-
this.add('route-map:blog', BlogMap);
|
|
4425
|
-
|
|
4426
|
-
this.router.map(function() {
|
|
4427
|
-
this.mount('blog');
|
|
4428
|
-
});
|
|
4429
|
-
|
|
4430
|
-
return this.visit('/').then(() => {
|
|
4431
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
4432
|
-
let PostRoute = Route.extend({ serialize() {} });
|
|
4433
|
-
this.applicationInstance.lookup('engine:blog').register('route:post', PostRoute);
|
|
4434
|
-
|
|
4435
|
-
assert.throws(
|
|
4436
|
-
() => router.transitionTo('blog.post'),
|
|
4437
|
-
/Defining a custom serialize method on an Engine route is not supported/
|
|
4438
|
-
);
|
|
4439
|
-
});
|
|
4440
|
-
}
|
|
4441
|
-
|
|
4442
|
-
['@test App.destroy does not leave undestroyed views after clearing engines'](assert) {
|
|
4443
|
-
assert.expect(4);
|
|
4444
|
-
|
|
4445
|
-
let engineInstance;
|
|
4446
|
-
// Register engine
|
|
4447
|
-
let BlogEngine = Engine.extend();
|
|
4448
|
-
this.add('engine:blog', BlogEngine);
|
|
4449
|
-
let EngineIndexRoute = Route.extend({
|
|
4450
|
-
init() {
|
|
4451
|
-
this._super(...arguments);
|
|
4452
|
-
engineInstance = getOwner(this);
|
|
4453
|
-
},
|
|
4454
|
-
});
|
|
4455
|
-
|
|
4456
|
-
// Register engine route map
|
|
4457
|
-
let BlogMap = function() {
|
|
4458
|
-
this.route('post');
|
|
4459
|
-
};
|
|
4460
|
-
this.add('route-map:blog', BlogMap);
|
|
4461
|
-
|
|
4462
|
-
this.router.map(function() {
|
|
4463
|
-
this.mount('blog');
|
|
4464
|
-
});
|
|
4465
|
-
|
|
4466
|
-
return this.visit('/')
|
|
4467
|
-
.then(() => {
|
|
4468
|
-
let engine = this.applicationInstance.lookup('engine:blog');
|
|
4469
|
-
engine.register('route:index', EngineIndexRoute);
|
|
4470
|
-
engine.register('template:index', compile('Engine Post!'));
|
|
4471
|
-
return this.visit('/blog');
|
|
4472
|
-
})
|
|
4473
|
-
.then(() => {
|
|
4474
|
-
assert.ok(true, '/blog has been handled');
|
|
4475
|
-
let route = engineInstance.lookup('route:index');
|
|
4476
|
-
let router = this.applicationInstance.lookup('router:main');
|
|
4477
|
-
|
|
4478
|
-
run(router, 'destroy');
|
|
4479
|
-
assert.equal(router._toplevelView, null, 'the toplevelView was cleared');
|
|
4480
|
-
|
|
4481
|
-
run(route, 'destroy');
|
|
4482
|
-
assert.equal(router._toplevelView, null, 'the toplevelView was not reinitialized');
|
|
4483
|
-
|
|
4484
|
-
run(this.applicationInstance, 'destroy');
|
|
4485
|
-
assert.equal(router._toplevelView, null, 'the toplevelView was not reinitialized');
|
|
4486
|
-
});
|
|
4487
|
-
}
|
|
4488
|
-
|
|
4489
|
-
["@test Generated route should be an instance of App's default route if provided"](assert) {
|
|
4490
|
-
let generatedRoute;
|
|
4491
|
-
|
|
4492
|
-
this.router.map(function() {
|
|
4493
|
-
this.route('posts');
|
|
4494
|
-
});
|
|
4495
|
-
|
|
4496
|
-
let AppRoute = Route.extend();
|
|
4497
|
-
this.add('route:basic', AppRoute);
|
|
4498
|
-
|
|
4499
|
-
return this.visit('/posts').then(() => {
|
|
4500
|
-
generatedRoute = this.applicationInstance.lookup('route:posts');
|
|
4501
|
-
|
|
4502
|
-
assert.ok(generatedRoute instanceof AppRoute, 'should extend the correct route');
|
|
4503
|
-
});
|
|
4504
|
-
}
|
|
4505
|
-
}
|
|
4506
|
-
);
|