Still adding more tests, fixed exception-handling bug.

This commit is contained in:
thosakwe 2017-06-30 09:49:45 -04:00
parent 79e4dccccd
commit 58ec66f454
5 changed files with 451 additions and 241 deletions

View file

@ -2,18 +2,11 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="7b89ff1e-1260-4dcf-9c3d-345de0471ea1" name="Default" comment="">
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/dbnavigator.xml" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/test/anonymous_service_test.dart" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/test/exception_test.dart" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/test/typed_service_test.dart" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/test/view_generator_test.dart" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/test/server_test.dart" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/angel_base.dart" afterPath="$PROJECT_DIR$/lib/src/http/angel_base.dart" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/angel_http_exception.dart" afterPath="$PROJECT_DIR$/lib/src/http/angel_http_exception.dart" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/anonymous_service.dart" afterPath="$PROJECT_DIR$/lib/src/http/anonymous_service.dart" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/typed_service.dart" afterPath="$PROJECT_DIR$/lib/src/http/typed_service.dart" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/hooked_service.dart" afterPath="$PROJECT_DIR$/lib/src/http/hooked_service.dart" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/server.dart" afterPath="$PROJECT_DIR$/lib/src/http/server.dart" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/test/all.dart" afterPath="$PROJECT_DIR$/test/all.dart" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/test/controller_test.dart" afterPath="$PROJECT_DIR$/test/controller_test.dart" />
</list>
<ignored path="$PROJECT_DIR$/.tmp/" />
<ignored path="$PROJECT_DIR$/temp/" />
@ -26,7 +19,7 @@
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="CoverageDataManager">
<SUITE FILE_PATH="coverage/framework$All_Tests__for_coverage_.coverage" NAME="All Tests (for coverage) Coverage Results" MODIFIED="1498774624592" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="DartCoverageRunner" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" CONTEXT_FILE_PATH="$PROJECT_DIR$/test/all.dart" />
<SUITE FILE_PATH="coverage/framework$All_Tests__for_coverage_.coverage" NAME="All Tests (for coverage) Coverage Results" MODIFIED="1498830529713" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="DartCoverageRunner" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" CONTEXT_FILE_PATH="$PROJECT_DIR$/test/all.dart" />
</component>
<component name="CreatePatchCommitExecutor">
<option name="PATCH_PATH" value="" />
@ -36,15 +29,17 @@
<favorites_list name="framework" />
</component>
<component name="FileEditorManager">
<splitter split-orientation="horizontal" split-proportion="0.37098846">
<splitter split-orientation="horizontal" split-proportion="0.41406664">
<split-first>
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="controller.dart" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/lib/src/http/controller.dart">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="375">
<file leaf-file-name="server.dart" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/lib/src/http/server.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1491">
<caret line="78" column="3" lean-forward="true" selection-start-line="78" selection-start-column="3" selection-end-line="78" selection-end-column="3" />
<folding />
<state relative-caret-position="-3416">
<caret line="486" column="37" lean-forward="true" selection-start-line="486" selection-start-column="37" selection-end-line="486" selection-end-column="37" />
<folding>
<element signature="e#38#58#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
@ -53,11 +48,11 @@
</split-first>
<split-second>
<leaf>
<file leaf-file-name="controller_test.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/test/controller_test.dart">
<file leaf-file-name="server_test.dart" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/test/server_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="333">
<caret line="92" column="33" lean-forward="false" selection-start-line="92" selection-start-column="33" selection-end-line="92" selection-end-column="33" />
<state relative-caret-position="246">
<caret line="187" column="53" lean-forward="true" selection-start-line="187" selection-start-column="53" selection-end-line="187" selection-end-column="53" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
@ -65,16 +60,6 @@
</provider>
</entry>
</file>
<file leaf-file-name="routable.dart" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/lib/src/http/routable.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-2212">
<caret line="26" column="38" lean-forward="false" selection-start-line="26" selection-start-column="38" selection-end-line="26" selection-end-column="38" />
<folding />
</state>
</provider>
</entry>
</file>
</leaf>
</split-second>
</splitter>
@ -88,16 +73,6 @@
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>BEFORE</find>
<find>_onError</find>
<find>_fatalErrorStream.add</find>
<find>throw</find>
<find>upa</find>
<find>transform</find>
<find>isAfter</find>
<find>isBefore</find>
<find>close</find>
<find>!_isOpen</find>
<find>end</find>
<find>reopen</find>
<find>REDIRECT</find>
@ -118,6 +93,16 @@
<find>index</find>
<find>typed</find>
<find>x</find>
<find>_afterP</find>
<find>_beforeP</find>
<find>optim</find>
<find>??=</find>
<find>dump</find>
<find>void li</find>
<find>_onError</find>
<find>Unhandled exc</find>
<find>handleAn</find>
<find>Tom Fo</find>
</findStrings>
<replaceStrings>
<replace>_isClosed</replace>
@ -143,7 +128,6 @@
<option value="$PROJECT_DIR$/test/hooked_test.dart" />
<option value="$PROJECT_DIR$/lib/src/http/fatal_error.dart" />
<option value="$PROJECT_DIR$/lib/src/http/memory_service.dart" />
<option value="$PROJECT_DIR$/lib/src/http/hooked_service.dart" />
<option value="$PROJECT_DIR$/lib/src/http/map_service.dart" />
<option value="$PROJECT_DIR$/lib/hooks.dart" />
<option value="$PROJECT_DIR$/test/util_test.dart" />
@ -156,7 +140,6 @@
<option value="$PROJECT_DIR$/lib/src/http/routable.dart" />
<option value="$PROJECT_DIR$/lib/src/http/response_context.dart" />
<option value="$PROJECT_DIR$/README.md" />
<option value="$PROJECT_DIR$/lib/src/http/server.dart" />
<option value="$PROJECT_DIR$/pubspec.yaml" />
<option value="$PROJECT_DIR$/test/view_generator_test.dart" />
<option value="$PROJECT_DIR$/lib/src/http/angel_base.dart" />
@ -165,9 +148,12 @@
<option value="$PROJECT_DIR$/lib/src/http/anonymous_service.dart" />
<option value="$PROJECT_DIR$/test/anonymous_service_test.dart" />
<option value="$PROJECT_DIR$/lib/src/http/typed_service.dart" />
<option value="$PROJECT_DIR$/test/all.dart" />
<option value="$PROJECT_DIR$/test/typed_service_test.dart" />
<option value="$PROJECT_DIR$/test/controller_test.dart" />
<option value="$PROJECT_DIR$/test/all.dart" />
<option value="$PROJECT_DIR$/lib/src/http/hooked_service.dart" />
<option value="$PROJECT_DIR$/lib/src/http/server.dart" />
<option value="$PROJECT_DIR$/test/server_test.dart" />
</list>
</option>
</component>
@ -393,6 +379,11 @@
<recursive>false</recursive>
<method />
</configuration>
<configuration default="false" name="tests in server_test.dart" type="DartTestRunConfigurationType" factoryName="Dart Test" nameIsGenerated="true">
<option name="filePath" value="$PROJECT_DIR$/test/server_test.dart" />
<option name="testName" value="server_test.dart" />
<method />
</configuration>
<configuration default="false" name="tests in anonymous_service_test.dart" type="DartTestRunConfigurationType" factoryName="Dart Test" nameIsGenerated="true">
<option name="filePath" value="$PROJECT_DIR$/test/anonymous_service_test.dart" />
<option name="testName" value="anonymous_service_test.dart" />
@ -419,18 +410,19 @@
<option name="testName" value="precontained_test.dart" />
<method />
</configuration>
<list size="11">
<item index="0" class="java.lang.String" itemvalue="Dart Test.tests in anonymous_service_test.dart" />
<item index="1" class="java.lang.String" itemvalue="Dart Test.tests in exception_test.dart" />
<item index="2" class="java.lang.String" itemvalue="Dart Test.tests in typed_service_test.dart" />
<item index="3" class="java.lang.String" itemvalue="Dart Test.default view generator in view_generator_test.dart" />
<item index="4" class="java.lang.String" itemvalue="Dart Test.tests in precontained_test.dart" />
<item index="5" class="java.lang.String" itemvalue="Dart Test.Controller Tests" />
<item index="6" class="java.lang.String" itemvalue="Dart Test.DI Tests" />
<item index="7" class="java.lang.String" itemvalue="Dart Test.Hooked Tests" />
<item index="8" class="java.lang.String" itemvalue="Dart Test.Routing Tests" />
<item index="9" class="java.lang.String" itemvalue="Dart Test.All Tests" />
<item index="10" class="java.lang.String" itemvalue="Dart Command Line App.All Tests (for coverage)" />
<list size="12">
<item index="0" class="java.lang.String" itemvalue="Dart Test.tests in server_test.dart" />
<item index="1" class="java.lang.String" itemvalue="Dart Test.tests in anonymous_service_test.dart" />
<item index="2" class="java.lang.String" itemvalue="Dart Test.tests in exception_test.dart" />
<item index="3" class="java.lang.String" itemvalue="Dart Test.tests in typed_service_test.dart" />
<item index="4" class="java.lang.String" itemvalue="Dart Test.default view generator in view_generator_test.dart" />
<item index="5" class="java.lang.String" itemvalue="Dart Test.tests in precontained_test.dart" />
<item index="6" class="java.lang.String" itemvalue="Dart Test.Controller Tests" />
<item index="7" class="java.lang.String" itemvalue="Dart Test.DI Tests" />
<item index="8" class="java.lang.String" itemvalue="Dart Test.Hooked Tests" />
<item index="9" class="java.lang.String" itemvalue="Dart Test.Routing Tests" />
<item index="10" class="java.lang.String" itemvalue="Dart Test.All Tests" />
<item index="11" class="java.lang.String" itemvalue="Dart Command Line App.All Tests (for coverage)" />
</list>
</component>
<component name="ShelveChangesManager" show_recycled="false">
@ -464,7 +456,8 @@
<workItem from="1497200155899" duration="120000" />
<workItem from="1497825298573" duration="2603000" />
<workItem from="1497985699191" duration="902000" />
<workItem from="1498770817945" duration="3831000" />
<workItem from="1498770817945" duration="3845000" />
<workItem from="1498826328044" duration="4240000" />
</task>
<task id="LOCAL-00001" summary="Re-designed exception">
<created>1481237183504</created>
@ -585,43 +578,50 @@
<option name="project" value="LOCAL" />
<updated>1497985995955</updated>
</task>
<option name="localTasksCounter" value="18" />
<task id="LOCAL-00018" summary="Added more tests.">
<created>1498774662381</created>
<option name="number" value="00018" />
<option name="presentableId" value="LOCAL-00018" />
<option name="project" value="LOCAL" />
<updated>1498774662382</updated>
</task>
<option name="localTasksCounter" value="19" />
<servers />
</component>
<component name="TestHistory">
<history-entry file="Controller_Tests - 2017.06.29 at 18h 07m 41s.xml">
<configuration name="Controller Tests" configurationId="DartTestRunConfigurationType" />
<history-entry file="tests_in_server_test_dart - 2017.06.30 at 09h 41m 06s.xml">
<configuration name="tests in server_test.dart" configurationId="DartTestRunConfigurationType" />
</history-entry>
<history-entry file="Controller_Tests - 2017.06.29 at 18h 08m 58s.xml">
<configuration name="Controller Tests" configurationId="DartTestRunConfigurationType" />
<history-entry file="tests_in_server_test_dart - 2017.06.30 at 09h 41m 28s.xml">
<configuration name="tests in server_test.dart" configurationId="DartTestRunConfigurationType" />
</history-entry>
<history-entry file="Controller_Tests - 2017.06.29 at 18h 10m 24s.xml">
<configuration name="Controller Tests" configurationId="DartTestRunConfigurationType" />
<history-entry file="tests_in_server_test_dart - 2017.06.30 at 09h 44m 00s.xml">
<configuration name="tests in server_test.dart" configurationId="DartTestRunConfigurationType" />
</history-entry>
<history-entry file="Controller_Tests - 2017.06.29 at 18h 11m 22s.xml">
<configuration name="Controller Tests" configurationId="DartTestRunConfigurationType" />
<history-entry file="tests_in_server_test_dart - 2017.06.30 at 09h 45m 33s.xml">
<configuration name="tests in server_test.dart" configurationId="DartTestRunConfigurationType" />
</history-entry>
<history-entry file="Controller_Tests - 2017.06.29 at 18h 15m 29s.xml">
<configuration name="Controller Tests" configurationId="DartTestRunConfigurationType" />
<history-entry file="tests_in_server_test_dart - 2017.06.30 at 09h 46m 44s.xml">
<configuration name="tests in server_test.dart" configurationId="DartTestRunConfigurationType" />
</history-entry>
<history-entry file="tests_in_typed_service_test_dart - 2017.06.29 at 18h 01m 34s.xml">
<configuration name="tests in typed_service_test.dart" configurationId="DartTestRunConfigurationType" />
<history-entry file="tests_in_server_test_dart - 2017.06.30 at 09h 46m 53s.xml">
<configuration name="tests in server_test.dart" configurationId="DartTestRunConfigurationType" />
</history-entry>
<history-entry file="tests_in_typed_service_test_dart - 2017.06.29 at 18h 01m 46s.xml">
<configuration name="tests in typed_service_test.dart" configurationId="DartTestRunConfigurationType" />
<history-entry file="tests_in_server_test_dart - 2017.06.30 at 09h 47m 15s.xml">
<configuration name="tests in server_test.dart" configurationId="DartTestRunConfigurationType" />
</history-entry>
<history-entry file="tests_in_typed_service_test_dart - 2017.06.29 at 18h 02m 10s.xml">
<configuration name="tests in typed_service_test.dart" configurationId="DartTestRunConfigurationType" />
<history-entry file="tests_in_server_test_dart - 2017.06.30 at 09h 47m 30s.xml">
<configuration name="tests in server_test.dart" configurationId="DartTestRunConfigurationType" />
</history-entry>
<history-entry file="tests_in_typed_service_test_dart - 2017.06.29 at 18h 04m 19s.xml">
<configuration name="tests in typed_service_test.dart" configurationId="DartTestRunConfigurationType" />
<history-entry file="tests_in_server_test_dart - 2017.06.30 at 09h 47m 46s.xml">
<configuration name="tests in server_test.dart" configurationId="DartTestRunConfigurationType" />
</history-entry>
<history-entry file="tests_in_typed_service_test_dart - 2017.06.29 at 18h 05m 00s.xml">
<configuration name="tests in typed_service_test.dart" configurationId="DartTestRunConfigurationType" />
<history-entry file="tests_in_server_test_dart - 2017.06.30 at 09h 48m 07s.xml">
<configuration name="tests in server_test.dart" configurationId="DartTestRunConfigurationType" />
</history-entry>
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="17287000" />
<option name="totallyTimeSpent" value="21541000" />
</component>
<component name="TodoView">
<todo-panel id="selected-file">
@ -638,25 +638,25 @@
<layout>
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3292683" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="DB Browser" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32998413" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32616082" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="DB Execution Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="DB Execution Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Dart Analysis" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32802936" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.28425822" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.34314835" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Coverage" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3250283" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.1760973" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3295583" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.1760973" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Tool Output" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32616082" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3295583" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="ANTLR Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
</layout>
@ -683,27 +683,14 @@
<MESSAGE value="+1" />
<MESSAGE value="1.0.4" />
<MESSAGE value="Patch" />
<option name="LAST_COMMIT_MESSAGE" value="Patch" />
<MESSAGE value="Added more tests." />
<option name="LAST_COMMIT_MESSAGE" value="Added more tests." />
</component>
<component name="XDebuggerManager">
<breakpoint-manager />
<watches-manager />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/test/hooked_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1275">
<caret line="90" column="29" lean-forward="true" selection-start-line="90" selection-start-column="29" selection-end-line="90" selection-end-column="29" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/common.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="195">
<caret line="13" column="1" lean-forward="true" selection-start-line="13" selection-start-column="1" selection-end-line="13" selection-end-column="1" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/controller_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
@ -736,7 +723,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45">
<caret line="3" column="34" lean-forward="true" selection-start-line="3" selection-start-column="34" selection-end-line="3" selection-end-column="34" />
<folding />
</state>
</provider>
</entry>
@ -857,14 +843,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="378">
<caret line="23" column="9" lean-forward="false" selection-start-line="23" selection-start-column="9" selection-end-line="23" selection-end-column="9" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/hooked_service.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1722">
<caret line="2" column="7" lean-forward="true" selection-start-line="2" selection-start-column="7" selection-end-line="2" selection-end-column="7" />
</state>
</provider>
</entry>
@ -872,9 +850,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="21">
<caret line="1" column="7" lean-forward="false" selection-start-line="1" selection-start-column="7" selection-end-line="1" selection-end-column="7" />
<folding>
<element signature="e#30#54#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
@ -896,9 +871,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="63">
<caret line="3" column="7" lean-forward="false" selection-start-line="3" selection-start-column="7" selection-end-line="3" selection-end-column="7" />
<folding>
<element signature="e#81#109#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
@ -909,33 +881,11 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/response_context.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="7077">
<caret line="345" column="2" lean-forward="false" selection-start-line="345" selection-start-column="2" selection-end-line="345" selection-end-column="2" />
<folding>
<element signature="e#48#68#0" expanded="true" />
<marker date="1497837059798" expanded="true" signature="10472:10474" ph="{...}" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/server.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="7329">
<caret line="364" column="7" lean-forward="true" selection-start-line="364" selection-start-column="7" selection-end-line="364" selection-end-column="7" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/README.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="84">
<caret line="4" column="0" lean-forward="true" selection-start-line="4" selection-start-column="0" selection-end-line="4" selection-end-column="0" />
<folding>
<marker date="1497837224385" expanded="true" signature="588:776" ph="{...}" />
</folding>
</first_editor>
<second_editor />
</state>
@ -945,9 +895,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="126">
<caret line="6" column="38" lean-forward="true" selection-start-line="6" selection-start-column="38" selection-end-line="6" selection-end-column="38" />
<folding>
<element signature="e#0#54#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
@ -963,9 +910,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="270">
<caret line="60" column="31" lean-forward="true" selection-start-line="60" selection-start-column="31" selection-end-line="60" selection-end-column="31" />
<folding>
<element signature="e#0#22#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
@ -981,10 +925,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-171">
<caret line="9" column="2" lean-forward="false" selection-start-line="9" selection-start-column="2" selection-end-line="9" selection-end-column="2" />
<folding>
<element signature="e#0#20#0" expanded="true" />
<marker date="1498772578410" expanded="true" signature="211:537" ph="{...}" />
</folding>
</state>
</provider>
</entry>
@ -992,7 +932,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
@ -1001,7 +940,7 @@
<state relative-caret-position="249">
<caret line="28" column="9" lean-forward="true" selection-start-line="28" selection-start-column="9" selection-end-line="28" selection-end-column="9" />
<folding>
<element signature="e#0#54#0" expanded="true" />
<element signature="e#0#54#0" expanded="false" />
</folding>
</state>
</provider>
@ -1010,7 +949,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="210">
<caret line="10" column="19" lean-forward="true" selection-start-line="10" selection-start-column="19" selection-end-line="10" selection-end-column="19" />
<folding />
</state>
</provider>
</entry>
@ -1018,7 +956,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="307">
<caret line="67" column="18" lean-forward="false" selection-start-line="67" selection-start-column="18" selection-end-line="67" selection-end-column="18" />
<folding />
</state>
</provider>
</entry>
@ -1026,17 +963,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="261">
<caret line="22" column="31" lean-forward="false" selection-start-line="22" selection-start-column="26" selection-end-line="22" selection-end-column="31" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/all.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="375">
<caret line="27" column="45" lean-forward="false" selection-start-line="27" selection-start-column="45" selection-end-line="27" selection-end-column="45" />
<folding>
<element signature="e#0#58#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
@ -1044,9 +970,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="126">
<caret line="6" column="0" lean-forward="true" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
<folding>
<element signature="e#0#54#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
@ -1054,7 +977,6 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="84">
<caret line="15" column="29" lean-forward="false" selection-start-line="15" selection-start-column="29" selection-end-line="20" selection-end-column="32" />
<folding />
</state>
</provider>
</entry>
@ -1062,35 +984,89 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="294">
<caret line="14" column="0" lean-forward="true" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/controller_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1785">
<caret line="92" column="33" lean-forward="false" selection-start-line="92" selection-start-column="33" selection-end-line="92" selection-end-column="33" />
<folding>
<element signature="e#0#20#0" expanded="true" />
<element signature="e#0#20#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/controller.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1491">
<caret line="78" column="3" lean-forward="true" selection-start-line="78" selection-start-column="3" selection-end-line="78" selection-end-column="3" />
<state relative-caret-position="231">
<caret line="88" column="30" lean-forward="true" selection-start-line="88" selection-start-column="30" selection-end-line="88" selection-end-column="30" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/controller_test.dart">
<entry file="file://$PROJECT_DIR$/test/all.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="333">
<caret line="92" column="33" lean-forward="false" selection-start-line="92" selection-start-column="33" selection-end-line="92" selection-end-column="33" />
<state relative-caret-position="462">
<caret line="22" column="33" lean-forward="true" selection-start-line="22" selection-start-column="33" selection-end-line="22" selection-end-column="33" />
<folding>
<element signature="e#0#58#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/hooked_service.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="378">
<caret line="83" column="24" lean-forward="false" selection-start-line="83" selection-start-column="24" selection-end-line="83" selection-end-column="24" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/routable.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="458">
<caret line="154" column="0" lean-forward="false" selection-start-line="154" selection-start-column="0" selection-end-line="154" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/response_context.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="200">
<caret line="295" column="25" lean-forward="false" selection-start-line="295" selection-start-column="25" selection-end-line="295" selection-end-column="25" />
<folding>
<element signature="e#48#68#0" expanded="true" />
<marker date="1497837059798" expanded="true" signature="10472:10474" ph="{...}" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/json_god-2.0.0-beta+1/lib/src/serialize.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="245">
<caret line="40" column="27" lean-forward="false" selection-start-line="40" selection-start-column="27" selection-end-line="40" selection-end-column="27" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/server_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="246">
<caret line="187" column="53" lean-forward="true" selection-start-line="187" selection-start-column="53" selection-end-line="187" selection-end-column="53" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/routable.dart">
<entry file="file://$PROJECT_DIR$/lib/src/http/server.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-2212">
<caret line="26" column="38" lean-forward="false" selection-start-line="26" selection-start-column="38" selection-end-line="26" selection-end-column="38" />
<folding />
<state relative-caret-position="-3416">
<caret line="486" column="37" lean-forward="true" selection-start-line="486" selection-start-column="37" selection-end-line="486" selection-end-column="37" />
<folding>
<element signature="e#38#58#0" expanded="true" />
</folding>
</state>
</provider>
</entry>

View file

@ -81,8 +81,7 @@ class HookedService extends Service {
afterModified._close();
afterUpdated._close();
afterRemoved._close();
if (inner is HookedService) inner.close();
await inner.close();
}
/// Adds hooks to this instance.

View file

@ -136,11 +136,6 @@ class Angel extends AngelBase {
/// The native HttpServer running this instancce.
HttpServer httpServer;
/// Handles a server error.
_onError(e, [StackTrace st]) {
_fatalErrorStream.add(new AngelFatalError(error: e, stack: st));
}
/// Starts the server.
///
/// Returns false on failure; otherwise, returns the HttpServer.
@ -254,37 +249,32 @@ class Angel extends AngelBase {
Future getHandlerResult(
handler, RequestContext req, ResponseContext res) async {
if (handler is RequestMiddleware) {
/*if (handler is RequestMiddleware) {
var result = await handler(req, res);
if (result is RequestHandler)
return await getHandlerResult(result, req, res);
else
return result;
}
}*/
if (handler is RequestHandler) {
var result = await handler(req, res);
if (result is RequestHandler)
return await getHandlerResult(result, req, res);
else
return result;
return await getHandlerResult(result, req, res);
}
if (handler is Future) {
var result = await handler;
if (result is RequestHandler)
return await getHandlerResult(result, req, res);
else
return result;
return await getHandlerResult(result, req, res);
}
if (handler is Function) {
var result = await runContained(handler, req, res);
if (result is RequestHandler)
return await getHandlerResult(result, req, res);
else
return result;
return await getHandlerResult(result, req, res);
}
if (handler is Stream) {
return await getHandlerResult(await handler.toList(), req, res);
}
var middleware = (req.app ?? this).findMiddleware(handler);
@ -300,17 +290,13 @@ class Angel extends AngelBase {
handler, RequestContext req, ResponseContext res) async {
var result = await getHandlerResult(handler, req, res);
if (result is Future) {
return await executeHandler(await result, req, res);
} else if (result is bool) {
if (result is bool) {
return result;
} else if (result != null) {
res.serialize(result,
contentType: res.headers[HttpHeaders.CONTENT_TYPE] ??
ContentType.JSON.mimeType);
return false;
} else if (result is Stream) {
return await executeHandler(await result.toList(), req, res);
} else
return res.isOpen;
}
@ -338,39 +324,36 @@ class Angel extends AngelBase {
return parent != null ? parent.findProperty(key) : null;
}
_handleAngelHttpException(AngelHttpException e, StackTrace st,
RequestContext req, ResponseContext res, HttpRequest request) async {
try {
if (req == null || res == null) {
_fatalErrorStream.add(new AngelFatalError(
request: request,
error: e?.error ??
e ??
new Exception('Unhandled exception while handling request.'),
stack: st));
return;
}
res.statusCode = e.statusCode;
List<String> accept = request?.headers[HttpHeaders.ACCEPT] ?? ['*/*'];
if (accept.isEmpty ||
accept.contains('*/*') ||
accept.contains(ContentType.JSON.mimeType) ||
accept.contains("application/javascript")) {
res.serialize(e.toMap(),
contentType: res.headers[HttpHeaders.CONTENT_TYPE] ??
ContentType.JSON.mimeType);
} else {
await errorHandler(e, req, res);
}
} catch (_) {
handleAngelHttpException(AngelHttpException e, StackTrace st,
RequestContext req, ResponseContext res, HttpRequest request,
{bool ignoreFinalizers: false}) async {
if (req == null || res == null) {
_fatalErrorStream.add(new AngelFatalError(
request: request,
error: e?.error ??
e ??
new Exception('Unhandled exception while handling request.'),
new Exception(
'handleAngelHttpException was called on a null request or response context.'),
stack: st));
return;
}
res.statusCode = e.statusCode;
List<String> accept = request?.headers[HttpHeaders.ACCEPT] ?? ['*/*'];
if (accept.isEmpty ||
accept.contains('*/*') ||
accept.contains(ContentType.JSON.mimeType) ||
accept.contains("application/javascript")) {
res.serialize(e.toMap(),
contentType: res.headers[HttpHeaders.CONTENT_TYPE] ??
ContentType.JSON.mimeType);
} else {
await errorHandler(e, req, res);
}
res.end();
await sendResponse(request, req, res,
ignoreFinalizers: ignoreFinalizers == true);
}
/// Handles a single request.
@ -415,17 +398,15 @@ class Angel extends AngelBase {
// 'Handler completed successfully, did not terminate response: $handler');
}
} on AngelHttpException catch (e, st) {
return await _handleAngelHttpException(e, st, req, res, request);
return await handleAngelHttpException(e, st, req, res, request);
}
}
try {
await sendResponse(request, req, res);
} on AngelHttpException catch (e, st) {
return await _handleAngelHttpException(e, st, req, res, request);
} catch (e, st) {
_fatalErrorStream
.add(new AngelFatalError(request: request, error: e, stack: st));
return await handleAngelHttpException(e, st, req, res, request,
ignoreFinalizers: true);
}
} catch (e, st) {
_fatalErrorStream
@ -442,6 +423,7 @@ class Angel extends AngelBase {
/// You may [force] the optimization to run, if you are not running in production.
void optimizeForProduction({bool force: false}) {
if (isProduction == true || force == true) {
_isProduction = true;
_add(v) {
if (v is Function && !_preContained.containsKey(v)) {
_preContained[v] = preInject(v);
@ -497,12 +479,15 @@ class Angel extends AngelBase {
/// Sends a response.
Future sendResponse(
HttpRequest request, RequestContext req, ResponseContext res) async {
HttpRequest request, RequestContext req, ResponseContext res,
{bool ignoreFinalizers: false}) async {
_afterProcessed.add(request);
if (!res.willCloseItself) {
for (var finalizer in responseFinalizers) {
await finalizer(req, res);
if (ignoreFinalizers != true) {
for (var finalizer in responseFinalizers) {
await finalizer(req, res);
}
}
if (res.isOpen) res.end();
@ -532,10 +517,16 @@ class Angel extends AngelBase {
}
/// Starts the server, wrapped in a [runZoned] call.
void listen({InternetAddress address, int port: 3000}) {
Future<HttpServer> listen({InternetAddress address, int port: 3000}) {
var c = new Completer<HttpServer>();
runZoned(() async {
await startServer(address, port);
}, onError: _onError);
await startServer(address, port)
.then(c.complete)
.catchError(c.completeError);
}, onError: (e, st) {
_fatalErrorStream.add(new AngelFatalError(error: e, stack: st));
});
return c.future;
}
/// Mounts the child on this router.

View file

@ -7,6 +7,7 @@ import 'hooked_test.dart' as hooked;
import 'precontained_test.dart' as precontained;
import 'routing_test.dart' as routing;
import 'serialize_test.dart' as serialize;
import 'server_test.dart' as server;
import 'services_test.dart' as services;
import 'typed_service_test.dart' as typed_service;
import 'util_test.dart' as util;
@ -24,6 +25,7 @@ main() {
group('precontained', precontained.main);
group('routing', routing.main);
group('serialize', serialize.main);
group('server', server.main);
group('services', services.main);
group('typed_service', typed_service.main);
group('util', util.main);

242
test/server_test.dart Normal file
View file

@ -0,0 +1,242 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:angel_framework/angel_framework.dart';
import 'package:matcher/matcher.dart';
import 'package:mock_request/mock_request.dart';
import 'package:test/test.dart';
final Uri $foo = Uri.parse('http://localhost:3000/foo');
/// Additional tests to improve coverage of server.dart
main() {
group('streams fired', () {
test('before+after processed are fired', () async {
var app = new Angel();
var before = app.beforeProcessed.first;
var after = app.afterProcessed.first;
var rq = new MockHttpRequest('GET', $foo);
rq.close();
await app.handleRequest(rq);
app.close();
expect(await before, rq);
expect(await after, rq);
});
test('oncontroller fired', () async {
var app = new Angel();
var ctrl = new FooController();
var f = app.onController.first;
await app.configure(ctrl);
expect(await f, ctrl);
});
});
group('scoping', () {
var parent = new Angel()..properties['two'] = 2;
var child = new Angel();
parent.use('/child', child);
test('sets children', () {
expect(parent.children, contains(child));
});
test('sets parent', () {
expect(child.parent, parent);
});
test('properties can climb up hierarchy', () {
expect(child.findProperty('two'), 2);
});
});
test('custom server generator', () {
var app = new Angel.custom(HttpServer.bind);
expect(app.serverGenerator, HttpServer.bind);
});
test('default error handler', () async {
var app = new Angel();
var rq = new MockHttpRequest('GET', $foo);
rq.close();
var rs = rq.response;
var req = await app.createRequestContext(rq);
var res = await app.createResponseContext(rs);
var e = new AngelHttpException(null,
statusCode: 321, message: 'Hello', errors: ['foo', 'bar']);
await app.errorHandler(e, req, res);
await app.sendResponse(rq, req, res);
expect(rs.headers.value(HttpHeaders.CONTENT_TYPE),
ContentType.HTML.toString());
expect(rs.statusCode, e.statusCode);
var body = await rs.transform(UTF8.decoder).join();
expect(body, contains('<title>${e.message}</title>'));
expect(body, contains('<li>foo</li>'));
expect(body, contains('<li>bar</li>'));
});
test('plug-ins run on startup', () async {
var app = new Angel();
app.justBeforeStart.add((app) async {
app.properties['two'] = 2;
});
await app.startServer();
expect(app.properties['two'], 2);
await app.close();
});
test('warning when adding routes to flattened router', () {
var app = new Angel()..optimizeForProduction(force: true);
app.dumpTree();
app.get('/', () => 2);
app.mount('/foo', new Router()..get('/', 3));
});
test('services close on close call', () async {
var app = new Angel();
var svc = new CustomCloseService();
expect(svc.value, 2);
app.use('/', svc);
await app.close();
expect(svc.value, 3);
});
test('global injection added to injection map', () {
var app = new Angel()..inject('a', 'b');
expect(app.injections['a'], 'b');
});
test('global injected serializer', () async {
var app = new Angel()..injectSerializer((_) => 'x');
app.get($foo.path, (req, ResponseContext res) => res.serialize(null));
var rq = new MockHttpRequest('GET', $foo)..close();
await app.handleRequest(rq);
var body = await rq.response.transform(UTF8.decoder).join();
expect(body, 'x');
});
group('handler results', () {
var app = new Angel();
RequestContext req;
ResponseContext res;
setUp(() async {
var rq = new MockHttpRequest('GET', $foo)..close();
req = await app.createRequestContext(rq);
res = await app.createResponseContext(rq.response);
});
group('getHandlerResult', () {
test('return request handler', () async {
var handler = (req, res) => (req, res) async {
return 2;
};
var r = await app.getHandlerResult(handler, req, res);
expect(r, 2);
});
test('return future', () async {
var handler = new Future.value(2);
expect(await app.getHandlerResult(handler, req, res), 2);
});
});
group('executeHandler', () {
test('return Stream', () async {
var handler = (req, res) => new Stream.fromIterable([2, 3]);
expect(await app.executeHandler(handler, req, res), isFalse);
});
test('end response', () async {
var handler = (req, res) => res.end();
expect(await app.executeHandler(handler, req, res), isFalse);
});
});
});
group('handleAngelHttpException', () {
Angel app;
setUp(() async {
app = new Angel();
await app.listen(address: InternetAddress.LOOPBACK_IP_V4, port: 0);
app.fatalErrorStream.listen((e) {
print('FATAL: ${e.error}');
print(e.stack);
});
});
tearDown(() => app.close());
test('null req/res', () async {
app.handleAngelHttpException(null, null, null, null, null);
var empty = app.fatalErrorStream.isEmpty;
await app.close();
expect(await empty, isFalse);
});
test('null req/res, valid error', () async {
app.handleAngelHttpException(
new AngelHttpException(new StateError('')), null, null, null, null);
var empty = app.fatalErrorStream.isEmpty;
await app.close();
expect(await empty, isFalse);
});
test('null req/res, http error', () async {
app.handleAngelHttpException(
new AngelHttpException.forbidden(), null, null, null, null);
var empty = app.fatalErrorStream.isEmpty;
await app.close();
expect(await empty, isFalse);
});
test('can send json', () async {
app.get('/wtf', () => throw new AngelHttpException.forbidden());
var rq = new MockHttpRequest('GET', new Uri(path: 'wtf'));
rq.close();
await app.handleRequest(rq);
expect(rq.response.statusCode, HttpStatus.FORBIDDEN);
expect(
rq.response.headers.contentType.mimeType, ContentType.JSON.mimeType);
});
test('can throw in finalizer', () async {
app.responseFinalizers
.add((req, res) => throw new AngelHttpException.forbidden());
var rq = new MockHttpRequest('GET', new Uri(path: 'wtf'));
rq.close();
await app.handleRequest(rq);
expect(rq.response.statusCode, HttpStatus.FORBIDDEN);
expect(
rq.response.headers.contentType.mimeType, ContentType.JSON.mimeType);
});
test('can send html', () async {
app.get('/wtf2', () => throw new AngelHttpException.forbidden());
var rq = new MockHttpRequest('GET', new Uri(path: 'wtf2'));
rq.headers.set(HttpHeaders.ACCEPT, ContentType.HTML.toString());
rq.close();
await app.handleRequest(rq);
expect(rq.response.statusCode, HttpStatus.FORBIDDEN);
expect(
rq.response.headers.contentType.mimeType, ContentType.HTML.mimeType);
});
});
}
class CustomCloseService extends Service {
int value = 2;
@override
Future close() {
value = 3;
return super.close();
}
}
@Expose('/foo')
class FooController extends Controller {
@Expose('/bar')
bar() async => 'baz';
}