diff --git a/coverage/lcov.info b/coverage/lcov.info index cf4cc6da..5b3058cb 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -1,85 +1,298 @@ -SF:lib/modules/home/home_module.dart -DA:8,0 -LF:1 -LH:0 +SF:lib/modules/home/home_view.dart +DA:56,30 +DA:58,1 +DA:59,1 +DA:76,1 +DA:78,1 +DA:79,3 +DA:81,1 +DA:82,2 +DA:85,1 +DA:92,1 +DA:94,2 +DA:97,1 +DA:99,2 +DA:102,1 +DA:104,2 +DA:107,1 +DA:109,2 +DA:112,1 +DA:114,2 +DA:117,1 +DA:119,3 +DA:122,1 +DA:124,2 +DA:127,0 +DA:129,0 +DA:132,1 +DA:134,3 +DA:136,1 +DA:137,2 +DA:141,2 +DA:142,1 +DA:143,1 +DA:144,3 +DA:146,1 +DA:147,3 +LF:35 +LH:33 end_of_record -SF:lib/modules/landing/landing_view.dart -DA:20,16 -DA:22,1 +SF:lib/modules/home/components/top_bar.dart +DA:4,29 +DA:6,1 +DA:8,1 +DA:10,1 +DA:11,1 +DA:13,1 +DA:15,1 +DA:16,1 +DA:19,1 +DA:20,1 DA:23,1 -DA:30,2 -DA:35,2 +DA:24,1 +DA:25,2 DA:36,1 +DA:39,1 DA:40,1 -DA:42,1 -DA:43,3 -DA:44,3 -DA:45,1 -DA:46,3 +DA:41,2 DA:50,1 DA:52,1 +DA:53,3 +DA:54,2 +DA:57,1 +DA:58,1 +DA:59,1 +DA:64,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,2 +DA:74,2 +LF:32 +LH:32 +end_of_record +SF:lib/modules/home/home_presenter.dart +DA:8,1 +DA:9,5 +DA:10,5 +DA:11,5 +DA:12,1 +DA:13,2 +DA:14,2 +DA:15,5 +DA:16,5 +DA:17,5 +DA:19,1 +DA:20,2 +DA:21,2 +DA:22,1 +DA:23,2 +DA:24,2 +DA:26,1 +DA:27,2 +DA:28,2 +DA:29,1 +DA:30,2 +DA:31,2 +DA:33,5 +DA:76,1 +DA:77,2 +DA:78,2 +DA:80,4 +DA:81,2 +DA:84,1 +DA:85,4 +DA:88,1 +DA:90,3 +DA:93,3 +DA:96,2 +DA:99,1 +DA:100,2 +DA:103,1 +DA:104,1 +DA:105,1 +DA:107,2 +DA:108,2 +DA:110,2 +DA:113,1 +DA:114,2 +DA:115,2 +DA:116,2 +DA:119,1 +DA:120,2 +DA:123,1 +DA:124,2 +DA:125,2 +DA:128,1 +DA:129,2 +DA:132,0 +DA:133,0 +DA:136,1 +DA:137,2 +DA:140,1 +DA:141,2 +LF:59 +LH:57 +end_of_record +SF:lib/modules/home/components/slide_item.dart +DA:5,2 +DA:7,1 +DA:11,1 +DA:17,1 +DA:20,1 +DA:26,1 +DA:29,1 +DA:31,1 +DA:33,1 +DA:34,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:40,1 +DA:42,3 +DA:46,1 +DA:48,1 +DA:49,1 +DA:51,1 DA:53,1 +DA:54,1 DA:55,1 DA:56,1 -DA:59,2 +DA:59,1 +DA:60,1 DA:63,1 -DA:64,1 -DA:66,1 -DA:67,2 -DA:75,1 -DA:77,2 +DA:65,1 +DA:66,2 +DA:77,1 DA:80,1 -DA:82,2 -DA:83,1 -LF:27 -LH:27 +DA:82,1 +DA:83,2 +DA:87,1 +DA:88,1 +DA:96,1 +DA:98,1 +DA:100,1 +DA:101,2 +DA:102,2 +DA:104,2 +DA:107,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:118,1 +DA:119,1 +LF:47 +LH:47 end_of_record -SF:lib/modules/landing/landing_router.dart -DA:10,1 +SF:lib/modules/home/home_module.dart +DA:45,1 +LF:1 +LH:1 +end_of_record +SF:lib/modules/home/home_router.dart +DA:9,1 DA:12,2 -DA:15,1 -DA:17,2 -LF:4 -LH:4 +DA:14,1 +LF:3 +LH:3 end_of_record -SF:lib/modules/landing/landing_presenter.dart +SF:lib/modules/home/components/page_control.dart +DA:4,29 +DA:6,1 DA:8,1 -DA:9,3 -DA:10,3 -DA:11,3 +DA:9,1 +DA:12,1 DA:13,1 DA:14,1 -DA:15,1 -DA:18,3 -DA:19,2 +DA:15,2 +DA:17,4 +DA:18,1 +DA:19,1 +DA:20,2 +DA:24,3 +DA:25,1 +DA:27,2 +DA:33,1 +LF:16 +LH:16 +end_of_record +SF:lib/modules/home/components/body.dart +DA:4,29 +DA:6,1 +DA:8,1 +DA:10,1 +DA:11,1 +DA:12,2 +DA:16,1 +DA:17,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,2 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,3 +DA:35,1 +DA:37,1 DA:38,1 DA:39,2 -DA:40,2 +DA:42,1 DA:43,1 -DA:44,2 +DA:44,1 DA:47,1 -DA:48,2 +DA:49,1 +DA:50,1 DA:51,1 +DA:52,1 DA:53,1 -DA:54,4 +DA:54,1 +DA:55,1 DA:56,1 -DA:57,4 -LF:21 -LH:21 -end_of_record -SF:lib/modules/landing/landing_interactor.dart -DA:16,1 -DA:18,4 -DA:19,5 -DA:20,2 -DA:21,3 -LF:5 -LH:5 +DA:57,2 +DA:58,1 +DA:60,1 +DA:62,2 +DA:64,1 +DA:65,2 +DA:66,1 +DA:68,1 +LF:41 +LH:41 end_of_record -SF:lib/modules/landing/landing_module.dart -DA:26,1 -LF:1 -LH:1 +SF:lib/modules/home/home_interactor.dart +DA:27,1 +DA:29,1 +DA:30,1 +DA:31,5 +DA:32,2 +DA:33,3 +DA:36,1 +DA:38,2 +DA:39,2 +DA:40,2 +DA:41,2 +DA:42,1 +DA:43,1 +DA:45,1 +DA:46,2 +DA:47,2 +DA:48,2 +DA:49,3 +DA:53,1 +DA:55,5 +DA:58,1 +DA:60,3 +DA:63,2 +DA:64,1 +DA:65,1 +DA:68,2 +LF:26 +LH:26 end_of_record SF:lib/components/alert/alert.dart DA:9,2 @@ -99,186 +312,64 @@ DA:54,6 LF:14 LH:13 end_of_record -SF:lib/modules/login/login_view.dart -DA:34,1 -DA:35,1 -DA:46,2 +SF:lib/components/common/progress_hud.dart +DA:12,4 +DA:16,4 +DA:18,4 +DA:22,4 +DA:23,4 +DA:24,4 +DA:27,0 +DA:34,0 +DA:35,0 +DA:40,4 +DA:41,4 +DA:43,4 +DA:50,1 DA:51,2 -DA:52,1 -DA:56,1 -DA:58,1 -DA:59,3 -DA:60,5 -DA:63,3 -DA:64,5 -DA:66,3 -DA:69,1 -DA:71,1 -DA:72,1 -DA:73,1 -DA:74,1 -DA:80,1 -DA:81,1 -DA:83,1 -DA:84,1 -DA:85,1 -DA:86,1 -DA:87,1 -DA:88,3 -DA:89,3 -DA:92,2 -DA:96,1 -DA:98,1 -DA:100,1 -DA:102,1 -DA:103,1 -DA:104,1 -DA:105,1 -DA:106,1 -DA:108,2 -DA:109,1 -DA:115,1 -DA:116,1 -DA:117,2 -DA:121,4 -DA:122,2 -DA:134,1 -DA:136,2 -DA:137,1 -DA:140,1 -DA:142,2 -DA:145,1 -DA:147,2 -LF:49 -LH:49 +DA:54,1 +DA:55,2 +LF:16 +LH:13 end_of_record -SF:lib/modules/login/login_presenter.dart -DA:8,1 -DA:9,3 -DA:10,3 -DA:11,3 -DA:12,3 -DA:13,1 -DA:14,2 -DA:16,3 -DA:17,3 -DA:44,1 -DA:45,2 -DA:46,2 -DA:49,1 -DA:50,4 -DA:53,1 -DA:54,2 -DA:55,4 -DA:58,1 -DA:59,4 -DA:60,2 -DA:63,1 -DA:64,4 -DA:67,1 -DA:68,2 -DA:69,2 -LF:25 -LH:25 -end_of_record -SF:lib/modules/login/login_interactor.dart -DA:16,1 -DA:18,2 -DA:19,1 -DA:25,3 -DA:26,3 -DA:27,1 -DA:28,3 -LF:7 -LH:7 -end_of_record -SF:lib/modules/login/login_router.dart -DA:9,1 -DA:11,2 -DA:14,1 -DA:16,2 -LF:4 -LH:4 -end_of_record -SF:lib/modules/login/components/form.dart -DA:4,1 -DA:5,1 -DA:9,3 -DA:11,1 -DA:13,1 -DA:16,1 -DA:18,1 -DA:20,1 -DA:22,1 -DA:23,1 -DA:27,1 -DA:31,1 -DA:32,2 -DA:33,1 -DA:34,1 -DA:36,2 -DA:38,6 -DA:39,3 -DA:40,3 -DA:50,1 -DA:51,1 -DA:53,1 -DA:55,2 -DA:56,1 -DA:58,2 -DA:63,1 -DA:64,1 -DA:66,1 -DA:68,2 -DA:69,1 -DA:71,2 -DA:72,1 -DA:74,5 -DA:75,2 -DA:78,1 -DA:79,3 -DA:80,1 -DA:81,1 -LF:38 -LH:38 +SF:lib/app.dart +DA:9,6 +DA:11,6 +DA:13,6 +DA:14,6 +DA:15,18 +DA:18,12 +DA:19,5 +DA:26,1 +LF:8 +LH:8 end_of_record -SF:lib/modules/login/login_module.dart -DA:34,1 -DA:36,1 -LF:2 +SF:lib/configs/app.dart +DA:4,29 +DA:6,0 +DA:10,29 +DA:12,0 +DA:14,0 +DA:22,0 +DA:24,0 +DA:32,0 +DA:34,0 +LF:9 LH:2 end_of_record -SF:lib/components/progress_hud/progress_hud.dart -DA:12,2 -DA:16,2 -DA:18,2 -DA:22,2 -DA:23,2 -DA:24,2 +SF:lib/gen/configs.gen.dart +DA:23,0 +DA:24,21 DA:27,0 -DA:34,0 -DA:35,0 -DA:40,2 -DA:41,2 -DA:43,2 -DA:50,1 -DA:51,2 -DA:54,1 -DA:55,2 -LF:16 -LH:13 +LF:3 +LH:1 end_of_record -SF:lib/app.dart -DA:9,3 -DA:11,3 -DA:13,3 -DA:14,3 -DA:15,9 -DA:18,6 -DA:19,3 -DA:26,0 -LF:8 -LH:7 +SF:lib/configs/colors.dart +DA:4,29 +DA:6,0 +DA:7,2 +LF:3 +LH:2 end_of_record SF:lib/configs/factories.dart DA:3,0 @@ -286,113 +377,116 @@ LF:1 LH:0 end_of_record SF:lib/configs/routes.dart -DA:3,12 +DA:3,21 DA:4,0 DA:5,2 DA:6,2 DA:7,0 -LF:5 +DA:8,0 +DA:9,0 +LF:7 LH:3 end_of_record -SF:lib/configs/app.dart -DA:4,15 -DA:6,2 -DA:10,15 -DA:12,0 -DA:14,0 -DA:22,2 -DA:24,2 -DA:32,2 -DA:34,2 -LF:9 -LH:7 -end_of_record -SF:lib/gen/configs.gen.dart -DA:16,0 -DA:17,12 -DA:19,0 -LF:3 -LH:1 -end_of_record SF:lib/core/classes/localized_exception.dart DA:4,0 LF:1 LH:0 end_of_record SF:lib/core/viper/module.dart -DA:18,0 -DA:19,0 -DA:21,0 -DA:22,0 -DA:23,0 -LF:5 -LH:0 +DA:19,3 +DA:20,3 +DA:21,3 +DA:23,1 +DA:24,1 +DA:26,2 +DA:27,3 +DA:28,2 +DA:30,1 +DA:31,1 +DA:35,1 +DA:36,2 +DA:46,0 +DA:47,0 +LF:14 +LH:12 end_of_record SF:lib/core/viper/view.dart -DA:16,3 -DA:18,3 -DA:20,6 -DA:22,3 -LF:4 -LH:4 +DA:17,6 +DA:19,6 +DA:21,6 +DA:22,6 +DA:25,6 +DA:27,6 +DA:29,6 +DA:30,0 +DA:33,6 +DA:34,6 +DA:37,6 +DA:39,12 +DA:40,6 +DA:43,6 +DA:44,12 +LF:15 +LH:14 end_of_record SF:lib/core/viper/presenter.dart -DA:9,3 -DA:14,3 -DA:15,3 -DA:16,3 -LF:4 +DA:11,6 +DA:16,6 +DA:17,6 +DA:18,6 +DA:21,0 +DA:22,0 +LF:6 LH:4 end_of_record SF:lib/components/button/button.dart -DA:9,2 -DA:14,2 -DA:16,2 -DA:18,2 -DA:19,2 -DA:20,2 -DA:21,2 -DA:23,2 -DA:24,4 -DA:25,4 -DA:26,2 -DA:28,2 -DA:29,2 -DA:30,2 -DA:31,2 -LF:15 -LH:15 +DA:9,3 +DA:14,3 +DA:16,3 +DA:18,3 +DA:19,3 +DA:20,3 +DA:21,3 +DA:23,3 +DA:24,6 +DA:25,6 +DA:26,3 +DA:27,3 +DA:28,3 +DA:29,3 +LF:14 +LH:14 end_of_record SF:lib/components/navigation_bar/navigation_bar.dart -DA:8,1 -DA:10,1 -DA:12,1 -DA:13,1 +DA:8,2 +DA:10,2 +DA:12,2 +DA:13,2 DA:14,0 -DA:15,1 -DA:17,2 -LF:7 -LH:6 +DA:15,6 +LF:6 +LH:5 end_of_record SF:lib/gen/assets.gen.dart -DA:11,15 +DA:11,29 DA:13,0 DA:15,1 -DA:17,3 +DA:17,1 DA:19,3 -DA:21,1 -DA:26,0 -DA:32,15 -DA:34,3 -DA:54,3 -DA:77,0 -DA:81,15 -DA:85,3 -DA:102,3 -DA:103,3 -DA:122,0 -LF:16 -LH:12 +DA:21,3 +DA:23,2 +DA:28,0 +DA:34,29 +DA:36,3 +DA:56,3 +DA:79,0 +DA:83,29 +DA:87,5 +DA:104,5 +DA:105,5 +DA:124,0 +LF:17 +LH:13 end_of_record SF:lib/components/translucent_text_field/translucent_text_field.dart DA:7,2 @@ -424,7 +518,7 @@ LF:25 LH:21 end_of_record SF:lib/core/extensions/build_context.dart -DA:5,4 +DA:5,8 LF:1 LH:1 end_of_record @@ -436,48 +530,59 @@ LF:3 LH:3 end_of_record SF:lib/core/extensions/stream.dart -DA:4,0 -DA:5,0 -DA:6,0 -DA:7,0 -DA:8,0 -DA:9,0 -DA:10,0 -DA:17,0 -DA:22,3 -DA:23,6 -DA:24,3 -LF:11 +DA:4,6 +DA:5,12 +DA:6,6 +LF:3 LH:3 end_of_record SF:lib/services/locator/locator_service_register.dart DA:4,0 DA:5,0 -DA:6,0 -DA:7,0 DA:8,0 DA:9,0 DA:10,0 +DA:11,0 DA:12,0 +DA:13,0 +DA:14,0 DA:15,0 -DA:16,0 -DA:17,0 -DA:20,0 -DA:21,0 +DA:18,0 +DA:19,0 DA:22,0 -DA:25,0 -DA:26,0 +DA:23,0 +DA:24,0 DA:27,0 -LF:17 -LH:0 +DA:28,0 +DA:29,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +LF:36 +LH:0 end_of_record SF:lib/services/locator/locator_service.dart -DA:14,20 +DA:20,28 LF:1 LH:1 end_of_record SF:lib/gen/flavors.gen.dart -DA:1,15 +DA:1,29 LF:1 LH:1 end_of_record @@ -489,9 +594,55 @@ DA:13,0 DA:14,0 DA:15,0 DA:16,0 -LF:7 +DA:17,0 +DA:18,0 +LF:9 LH:0 end_of_record +SF:lib/models/survey_info.dart +DA:11,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:19,0 +DA:23,3 +DA:24,12 +LF:9 +LH:2 +end_of_record +SF:lib/models/survey_question_info.dart +DA:13,0 +DA:15,0 +DA:17,0 +DA:18,0 +DA:20,0 +DA:22,0 +DA:23,0 +DA:25,0 +DA:27,0 +DA:28,0 +DA:30,0 +DA:32,0 +DA:33,0 +DA:36,0 +DA:38,0 +DA:39,0 +DA:42,0 +DA:44,0 +DA:45,0 +DA:47,0 +DA:49,0 +DA:50,0 +DA:52,0 +DA:54,0 +DA:55,0 +DA:62,29 +DA:79,0 +LF:27 +LH:1 +end_of_record SF:lib/models/user_info.dart DA:7,0 DA:9,0 @@ -500,191 +651,747 @@ LF:3 LH:0 end_of_record SF:lib/modules/forgot_password/forgot_password_view.dart -DA:31,16 -DA:33,1 -DA:34,1 -DA:44,2 -DA:49,2 -DA:52,2 -DA:59,1 -DA:61,3 -DA:62,5 -DA:64,3 -DA:65,1 -DA:68,1 -DA:69,2 -DA:70,2 -DA:71,1 -DA:74,1 -DA:77,1 -DA:79,1 +DA:36,30 +DA:38,1 +DA:39,1 +DA:49,1 +DA:50,1 +DA:55,2 +DA:60,2 +DA:67,1 +DA:69,3 +DA:70,5 +DA:72,3 +DA:73,1 +DA:76,1 +DA:77,2 +DA:78,1 DA:80,1 -DA:81,2 -DA:85,1 -DA:86,1 +DA:81,1 +DA:84,1 DA:87,1 -DA:88,1 DA:89,1 -DA:94,2 +DA:90,1 +DA:91,2 +DA:95,1 DA:96,1 DA:97,1 DA:98,1 DA:99,1 -DA:101,1 -DA:103,1 -DA:104,1 -DA:108,2 +DA:104,2 +DA:106,1 +DA:107,1 +DA:108,1 +DA:109,1 +DA:111,1 +DA:113,1 DA:114,1 -DA:115,2 -DA:117,1 -DA:119,1 +DA:118,2 +DA:124,1 DA:125,1 -DA:127,1 -DA:129,1 +DA:126,1 +DA:128,1 DA:130,1 -DA:131,1 -DA:137,1 +DA:136,1 DA:138,1 -DA:139,2 +DA:140,1 DA:141,1 -DA:142,5 -DA:144,2 -DA:152,1 -DA:153,2 -DA:154,1 +DA:142,1 +DA:148,1 +DA:149,1 +DA:150,2 +DA:152,3 +DA:153,3 +DA:155,1 DA:156,1 -DA:168,1 -DA:170,2 -DA:173,1 -DA:175,2 -DA:178,1 -DA:180,2 -DA:183,1 -DA:184,2 -DA:185,2 -DA:188,1 -DA:190,2 -DA:191,2 -DA:192,1 -LF:66 -LH:66 +DA:164,1 +DA:165,2 +DA:166,1 +DA:169,1 +DA:181,1 +DA:183,2 +DA:186,1 +DA:188,2 +DA:191,1 +DA:193,2 +DA:196,1 +DA:197,2 +DA:198,2 +DA:201,1 +DA:203,2 +DA:204,2 +DA:205,2 +DA:206,1 +LF:71 +LH:71 end_of_record SF:lib/modules/forgot_password/forgot_password_presenter.dart -DA:6,1 -DA:7,3 -DA:8,3 -DA:10,3 -DA:11,3 +DA:8,1 +DA:9,5 +DA:10,5 +DA:12,5 +DA:13,5 DA:31,1 DA:32,3 DA:35,1 -DA:36,2 -DA:37,2 -DA:40,1 -DA:41,2 -DA:42,2 -DA:43,2 +DA:36,2 +DA:37,2 +DA:40,1 +DA:41,2 +DA:42,2 +DA:43,2 +DA:46,1 +DA:47,2 +DA:48,2 +LF:17 +LH:17 +end_of_record +SF:lib/modules/forgot_password/components/reset_successfully_notification.dart +DA:4,29 +DA:6,1 +DA:8,1 +DA:9,1 +DA:11,1 +DA:13,1 +DA:15,1 +DA:16,2 +DA:20,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:33,1 +DA:34,1 +DA:35,1 +LF:16 +LH:16 +end_of_record +SF:lib/modules/forgot_password/forgot_password_interactor.dart +DA:17,1 +DA:19,1 +DA:20,1 +DA:21,5 +DA:22,1 +DA:23,4 +LF:6 +LH:6 +end_of_record +SF:lib/modules/forgot_password/forgot_password_module.dart +DA:30,1 +LF:1 +LH:1 +end_of_record +SF:lib/modules/landing/landing_router.dart +DA:10,1 +DA:12,1 +DA:13,1 +DA:16,1 +DA:18,1 +DA:19,1 +LF:6 +LH:6 +end_of_record +SF:lib/modules/landing/landing_presenter.dart +DA:8,1 +DA:9,5 +DA:10,5 +DA:11,1 +DA:12,2 +DA:13,2 +DA:15,1 +DA:16,3 +DA:17,2 +DA:18,2 +DA:36,1 +DA:37,2 +DA:38,2 +DA:41,1 +DA:42,2 +DA:45,1 +DA:46,2 +DA:49,1 +DA:51,1 +DA:52,4 +DA:54,1 +DA:55,4 +LF:22 +LH:22 +end_of_record +SF:lib/modules/landing/landing_interactor.dart +DA:16,1 +DA:18,4 +DA:19,5 +DA:20,2 +DA:21,3 +LF:5 +LH:5 +end_of_record +SF:lib/modules/landing/landing_view.dart +DA:20,30 +DA:22,1 +DA:23,1 +DA:30,2 +DA:35,2 +DA:36,1 +DA:40,1 +DA:42,1 +DA:43,3 +DA:44,3 +DA:45,1 +DA:46,3 +DA:50,1 +DA:52,1 +DA:53,1 +DA:55,1 +DA:56,1 +DA:59,2 +DA:63,1 +DA:64,1 +DA:66,1 +DA:67,2 +DA:75,1 +DA:77,2 +DA:80,1 +DA:82,2 +DA:83,1 +LF:27 +LH:27 +end_of_record +SF:lib/modules/landing/landing_module.dart +DA:26,1 +LF:1 +LH:1 +end_of_record +SF:lib/modules/login/login_view.dart +DA:34,1 +DA:35,1 +DA:46,2 +DA:51,2 +DA:52,1 +DA:56,1 +DA:58,1 +DA:59,3 +DA:60,5 +DA:63,3 +DA:64,5 +DA:66,3 +DA:69,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:80,1 +DA:81,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,3 +DA:89,3 +DA:92,2 +DA:96,1 +DA:98,1 +DA:100,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:108,2 +DA:109,1 +DA:115,1 +DA:116,1 +DA:117,2 +DA:121,4 +DA:122,2 +DA:134,1 +DA:136,2 +DA:137,2 +DA:138,2 +DA:139,1 +DA:142,1 +DA:144,2 +DA:147,1 +DA:149,2 +LF:51 +LH:51 +end_of_record +SF:lib/modules/login/login_presenter.dart +DA:8,1 +DA:9,5 +DA:10,5 +DA:11,5 +DA:12,3 +DA:13,1 +DA:14,2 +DA:15,2 +DA:17,5 +DA:18,5 +DA:45,1 +DA:46,2 +DA:47,2 +DA:50,1 +DA:51,4 +DA:54,1 +DA:55,1 +DA:56,1 +DA:58,2 +DA:59,2 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,2 +DA:66,2 +DA:69,1 +DA:70,4 +DA:73,1 +DA:74,2 +DA:75,2 +LF:30 +LH:30 +end_of_record +SF:lib/modules/login/login_interactor.dart +DA:16,1 +DA:18,1 +DA:19,1 +DA:20,5 +DA:21,1 +DA:22,4 +LF:6 +LH:6 +end_of_record +SF:lib/modules/login/login_router.dart +DA:10,1 +DA:12,2 +DA:15,1 +DA:17,2 +LF:4 +LH:4 +end_of_record +SF:lib/modules/login/components/form.dart +DA:4,1 +DA:5,1 +DA:9,3 +DA:11,1 +DA:13,1 +DA:16,1 +DA:18,1 +DA:20,1 +DA:22,1 +DA:23,1 +DA:27,1 +DA:31,1 +DA:32,2 +DA:33,1 +DA:34,1 +DA:36,2 +DA:38,6 +DA:39,3 +DA:40,3 +DA:50,1 +DA:51,1 +DA:53,1 +DA:55,2 +DA:56,1 +DA:58,2 +DA:63,1 +DA:64,1 +DA:66,1 +DA:68,2 +DA:69,1 +DA:71,2 +DA:72,1 +DA:74,5 +DA:75,2 +DA:78,1 +DA:79,3 +DA:80,1 +DA:81,1 +LF:38 +LH:38 +end_of_record +SF:lib/modules/login/login_module.dart +DA:34,1 +DA:36,1 +LF:2 +LH:2 +end_of_record +SF:lib/modules/side_menu/components/content.dart +DA:4,29 +DA:6,2 +DA:8,2 +DA:9,2 +DA:10,2 +DA:12,2 +DA:13,2 +DA:15,2 +DA:23,2 +DA:24,2 +LF:10 +LH:10 +end_of_record +SF:lib/modules/side_menu/side_menu_interactor.dart +DA:17,0 +DA:18,0 +DA:20,1 +DA:22,1 +DA:23,1 +DA:24,5 +DA:25,1 +DA:26,4 +LF:8 +LH:6 +end_of_record +SF:lib/modules/side_menu/side_menu_presenter.dart +DA:8,1 +DA:9,5 +DA:10,5 +DA:11,5 +DA:12,5 +DA:30,1 +DA:31,2 +DA:34,1 +DA:35,4 +DA:38,1 +DA:39,4 +DA:42,0 +DA:43,0 +LF:13 +LH:11 +end_of_record +SF:lib/modules/side_menu/side_menu_view.dart +DA:18,30 +DA:20,2 +DA:21,2 +DA:30,2 +DA:32,2 +DA:33,6 +DA:36,2 +DA:41,1 +DA:43,2 +LF:9 +LH:9 +end_of_record +SF:lib/modules/side_menu/side_menu_router.dart +DA:8,1 +DA:10,2 +LF:2 +LH:2 +end_of_record +SF:lib/modules/side_menu/components/user.dart +DA:4,29 +DA:6,2 +DA:8,2 +DA:10,2 +DA:11,2 +DA:12,1 +DA:13,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:27,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:41,2 +LF:19 +LH:19 +end_of_record +SF:lib/modules/side_menu/side_menu_module.dart +DA:31,2 +LF:1 +LH:1 +end_of_record +SF:lib/modules/side_menu/components/actions.dart +DA:4,29 +DA:6,2 +DA:8,2 +DA:10,2 +DA:12,4 +DA:13,2 +DA:16,2 +DA:19,2 +DA:20,4 +DA:21,2 +DA:23,2 +LF:11 +LH:11 +end_of_record +SF:lib/modules/survey_detail/components/content.dart +DA:4,29 +DA:6,1 +DA:9,1 +DA:11,1 +DA:12,1 +DA:13,2 +DA:17,1 +DA:18,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,2 +DA:25,2 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:36,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,2 +DA:42,1 +DA:52,1 +DA:53,1 +DA:54,2 +DA:55,1 +DA:56,1 +DA:57,1 +DA:62,2 +DA:63,1 +DA:65,1 +DA:66,1 +DA:70,1 +DA:72,1 +DA:73,2 +DA:74,1 +DA:75,1 +DA:76,1 +LF:41 +LH:41 +end_of_record +SF:lib/modules/survey_detail/survey_detail_view.dart +DA:18,30 +DA:20,1 +DA:21,1 +DA:28,2 +DA:30,1 +DA:32,1 +DA:35,1 +DA:37,1 +DA:38,3 +DA:41,1 DA:46,1 -DA:47,2 DA:48,2 -LF:17 -LH:17 +LF:12 +LH:12 end_of_record -SF:lib/modules/forgot_password/components/reset_successfully_notification.dart -DA:4,15 -DA:6,1 +SF:lib/modules/survey_detail/survey_detail_module.dart +DA:34,1 +DA:41,2 +LF:2 +LH:2 +end_of_record +SF:lib/modules/survey_detail/survey_detail_presenter.dart DA:8,1 -DA:9,1 -DA:11,1 -DA:13,1 +DA:9,5 +DA:10,1 +DA:11,2 +DA:12,2 +DA:14,5 DA:15,1 DA:16,2 -DA:20,1 -LF:9 -LH:9 +DA:17,2 +DA:35,1 +DA:36,4 +DA:39,1 +DA:40,2 +DA:41,2 +DA:44,1 +DA:45,2 +DA:46,4 +DA:49,1 +DA:50,2 +DA:51,2 +LF:20 +LH:20 end_of_record -SF:lib/modules/forgot_password/forgot_password_interactor.dart -DA:16,1 -DA:18,2 +SF:lib/modules/survey_detail/survey_detail_router.dart +DA:9,0 +LF:1 +LH:0 +end_of_record +SF:lib/modules/survey_detail/survey_detail_interactor.dart DA:19,1 -DA:22,3 -DA:23,3 +DA:20,2 +DA:22,1 DA:24,1 DA:25,3 -LF:7 -LH:7 +DA:26,5 +DA:27,2 +DA:28,3 +LF:8 +LH:8 end_of_record -SF:lib/modules/forgot_password/forgot_password_module.dart -DA:28,1 -LF:1 +SF:lib/services/api/api_raw_response.dart +DA:8,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:23,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +LF:11 +LH:0 +end_of_record +SF:lib/services/api/api_exception.dart +DA:4,29 +DA:10,0 +DA:11,0 +DA:12,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:21,0 +LF:9 LH:1 end_of_record +SF:lib/services/api/api_list_object.dart +DA:4,0 +LF:1 +LH:0 +end_of_record +SF:lib/services/api/api_service_register.dart +DA:5,0 +DA:6,0 +DA:7,0 +LF:3 +LH:0 +end_of_record +SF:lib/services/api/api_service.dart +DA:50,0 +DA:59,0 +DA:69,0 +DA:73,0 +DA:82,0 +DA:92,0 +DA:99,0 +DA:108,0 +DA:116,0 +DA:126,0 +DA:128,0 +DA:134,0 +DA:137,0 +DA:139,0 +DA:141,0 +DA:145,0 +DA:146,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:155,0 +DA:159,0 +DA:163,0 +DA:164,0 +DA:167,0 +DA:169,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:177,0 +LF:30 +LH:0 +end_of_record SF:lib/modules/screen.dart -DA:11,18 -DA:16,3 -DA:20,3 -DA:21,3 -DA:22,3 -DA:23,3 -DA:27,0 -DA:28,0 -DA:32,3 -DA:33,3 +DA:11,6 +DA:16,6 +DA:20,6 +DA:21,6 +DA:22,5 +DA:24,5 +DA:28,1 +DA:30,1 +DA:34,6 +DA:35,6 LF:10 -LH:8 +LH:10 end_of_record -SF:lib/services/auth/auth_service.dart +SF:lib/repositories/auth_repository.dart +DA:43,0 +DA:44,0 +DA:46,0 DA:47,0 -DA:48,0 +DA:49,0 DA:50,0 -DA:51,0 DA:53,0 -DA:54,0 DA:57,0 -DA:60,0 +DA:58,0 +DA:59,0 +DA:61,0 DA:65,0 -DA:66,0 -DA:70,0 +DA:67,0 +DA:68,0 +DA:71,0 DA:72,0 -DA:76,0 +DA:73,0 +DA:74,0 DA:78,0 DA:79,0 DA:80,0 -DA:84,0 -DA:85,0 +DA:82,0 +DA:83,0 DA:87,0 DA:88,0 DA:92,0 DA:93,0 -DA:97,0 -DA:98,0 +DA:95,0 +DA:96,0 DA:100,0 DA:101,0 +DA:102,0 DA:105,0 -DA:106,0 DA:107,0 -DA:110,0 -DA:112,0 -DA:119,0 -DA:120,0 -DA:121,0 -DA:124,0 -DA:125,0 -DA:126,0 -DA:129,0 -DA:130,0 -DA:131,0 -DA:136,0 -DA:137,0 -LF:42 +DA:108,0 +LF:35 LH:0 end_of_record -SF:lib/services/auth/params/auth_login_params.dart -DA:4,1 -DA:10,1 -DA:13,2 -DA:14,2 -DA:18,1 +SF:lib/repositories/survey_repository.dart +DA:24,0 +DA:25,0 +DA:26,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:35,0 +DA:39,0 +DA:41,0 +DA:44,0 +DA:45,0 +DA:49,0 +DA:52,0 +DA:54,0 +DA:55,0 +LF:15 +LH:0 +end_of_record +SF:lib/services/api/auth/auth_api_service.dart +DA:30,0 +DA:34,0 +DA:41,0 +DA:43,0 +DA:49,0 +DA:51,0 +LF:6 +LH:0 +end_of_record +SF:lib/services/api/auth/params/auth_login_params.dart +DA:4,0 +DA:10,0 +DA:13,0 +DA:14,0 +DA:18,0 DA:31,0 DA:33,0 DA:34,0 @@ -693,75 +1400,88 @@ DA:36,0 DA:37,0 DA:38,0 LF:12 -LH:5 -end_of_record -SF:lib/services/auth/params/auth_reset_password_params.dart -DA:4,1 -DA:9,1 -DA:11,2 -DA:12,2 -DA:16,1 -DA:26,0 -DA:28,0 -DA:29,0 -DA:30,0 -LF:9 -LH:5 +LH:0 end_of_record -SF:lib/services/api/api_exception.dart +SF:lib/services/api/auth/params/auth_reset_password_params.dart DA:4,0 -DA:10,0 -DA:11,0 DA:12,0 +DA:14,0 +DA:15,0 DA:16,0 -DA:17,0 -DA:18,0 -DA:19,0 -DA:21,0 -LF:9 -LH:0 -end_of_record -SF:lib/services/api/api_service_register.dart -DA:5,0 -DA:6,0 -DA:7,0 -LF:3 +LF:5 LH:0 end_of_record -SF:lib/services/api/api_void_object.dart -DA:4,0 -LF:1 +SF:lib/services/api/user/user_api_service.dart +DA:15,0 +DA:17,0 +LF:2 LH:0 end_of_record -SF:lib/services/api/api_service.dart +SF:lib/services/local_storage/local_storage_service.dart +DA:23,0 +DA:25,0 +DA:26,0 +DA:30,0 +DA:31,0 DA:32,0 -DA:40,0 -DA:42,0 -DA:47,0 +DA:38,0 +DA:39,0 +DA:43,0 +DA:44,0 +DA:45,0 DA:50,0 DA:52,0 -DA:54,0 +DA:53,0 +DA:57,0 +DA:59,0 DA:60,0 DA:61,0 -DA:64,0 DA:65,0 DA:66,0 DA:67,0 -DA:68,0 -DA:72,0 -DA:77,0 -LF:16 +LF:21 +LH:0 +end_of_record +SF:lib/services/api/survey/survey_api_service.dart +DA:25,0 +DA:26,0 +DA:28,0 +DA:31,0 +DA:32,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:42,0 +DA:47,0 +DA:49,0 +LF:14 +LH:0 +end_of_record +SF:lib/services/api/survey/params/survey_list_params.dart +DA:7,0 +DA:12,0 +DA:14,0 +DA:15,0 +LF:4 +LH:0 +end_of_record +SF:lib/services/api/survey/params/survey_info_params.dart +DA:6,0 +LF:1 LH:0 end_of_record SF:lib/services/http/http_method.dart DA:4,0 -DA:5,15 +DA:5,29 DA:13,0 LF:3 LH:1 end_of_record SF:lib/services/http/http_exception.dart -DA:3,15 +DA:3,29 DA:25,0 DA:31,0 DA:33,0 @@ -784,10 +1504,12 @@ DA:23,0 DA:31,0 DA:37,0 DA:39,0 +DA:40,0 +DA:43,0 DA:44,0 DA:45,0 DA:46,0 -LF:8 +LF:10 LH:0 end_of_record SF:lib/services/http/http_response.dart @@ -801,9 +1523,3 @@ DA:21,0 LF:7 LH:0 end_of_record -SF:lib/services/user/user_service.dart -DA:13,0 -DA:15,0 -LF:2 -LH:0 -end_of_record diff --git a/lib/modules/survey_detail/components/content.dart b/lib/modules/survey_detail/components/content.dart index 4654d933..631e0560 100644 --- a/lib/modules/survey_detail/components/content.dart +++ b/lib/modules/survey_detail/components/content.dart @@ -21,6 +21,7 @@ class Content extends StatelessWidget { StreamsSelector0.value( stream: state._survey, builder: (_, survey, __) => Image( + key: SurveyDetailView.backgroundImageKey, image: NetworkImage(survey.coverImageUrl!), fit: BoxFit.fill, ), @@ -67,6 +68,7 @@ class Content extends StatelessWidget { minWidth: 140, ), child: Button( + key: SurveyDetailView.startSurveyButtonKey, onPressed: () => state .delegate?.startSurveyButtonDidTap .add(null), diff --git a/lib/modules/survey_detail/survey_detail_view.dart b/lib/modules/survey_detail/survey_detail_view.dart index b070fd69..d3f49bc4 100644 --- a/lib/modules/survey_detail/survey_detail_view.dart +++ b/lib/modules/survey_detail/survey_detail_view.dart @@ -8,6 +8,9 @@ abstract class SurveyDetailViewDelegate implements AlertViewMixinDelegate { abstract class SurveyDetailView extends View with ProgressHUDViewMixin, AlertViewMixin { + static const backgroundImageKey = Key("background_image_"); + static const startSurveyButtonKey = Key("start_survey_button"); + void setSurvey(SurveyInfo survey); } diff --git a/test/modules/survey_detail/survey_detail_interactor_test.dart b/test/modules/survey_detail/survey_detail_interactor_test.dart new file mode 100644 index 00000000..f447e6dc --- /dev/null +++ b/test/modules/survey_detail/survey_detail_interactor_test.dart @@ -0,0 +1,77 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:quick_test/quick_test.dart'; +import 'package:survey/models/detailed_survey_info.dart'; +import 'package:survey/models/survey_info.dart'; +import 'package:survey/modules/survey_detail/survey_detail_module.dart'; +import 'package:survey/repositories/survey_repository.dart'; +import 'package:survey/services/locator/locator_service.dart'; +import '../../helpers/behavior_subject_generator.dart'; +import 'survey_detail_interactor_test.mocks.dart'; + +@GenerateMocks([SurveyDetailInteractorDelegate, SurveyRepository]) +void main() { + describe("a SurveyDetail interactor", () { + late SurveyDetailInteractor interactor; + late MockSurveyDetailInteractorDelegate delegate; + late BehaviorSubjectGenerator generator; + late MockSurveyRepository surveyRepository; + + final survey = SurveyInfo(); + survey.id = "id"; + + beforeEach(() { + generator = BehaviorSubjectGenerator(); + + surveyRepository = MockSurveyRepository(); + locator.registerSingleton(surveyRepository); + + delegate = MockSurveyDetailInteractorDelegate(); + when(delegate.detailedSurveyDidFetch) + .thenAnswer((realInvocation) => generator.make(0)); + when(delegate.detailedSurveyDidFailToFetch) + .thenAnswer((realInvocation) => generator.make(1)); + + interactor = SurveyDetailInteractorImpl(); + interactor.delegate = delegate; + interactor.arguments = SurveyDetailArguments(survey: survey); + }); + + describe("it's survey is got", () { + it("returns correct survey", () { + expect(interactor.survey, survey); + }); + }); + + describe("it's fetchDetailedSurvey() is called", () { + context("when survey repository's fetchDetailedSurvey() return success", + () { + final detailedSurvey = DetailedSurveyInfo(); + beforeEach(() { + when(surveyRepository.fetchDetailedSurvey(any)) + .thenAnswer((realInvocation) => Future.value(detailedSurvey)); + interactor.fetchDetailedSurvey(); + }); + + it("triggers delegate's detailedSurveyDidFetch emits", () { + expect(delegate.detailedSurveyDidFetch, emits(detailedSurvey)); + }); + }); + + context("when survey repository's fetchDetailedSurvey() return failure", + () { + final exception = Exception(); + beforeEach(() { + when(surveyRepository.fetchDetailedSurvey(any)) + .thenAnswer((realInvocation) => Future.error(exception)); + interactor.fetchDetailedSurvey(); + }); + + it("triggers delegate's detailedSurveyDidFailToFetch emits", () { + expect(delegate.detailedSurveyDidFailToFetch, emits(exception)); + }); + }); + }); + }); +} diff --git a/test/modules/survey_detail/survey_detail_interactor_test.mocks.dart b/test/modules/survey_detail/survey_detail_interactor_test.mocks.dart new file mode 100644 index 00000000..f0184015 --- /dev/null +++ b/test/modules/survey_detail/survey_detail_interactor_test.mocks.dart @@ -0,0 +1,72 @@ +// Mocks generated by Mockito 5.0.7 from annotations +// in survey/test/modules/survey_detail/survey_detail_interactor_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i6; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:rxdart/src/subjects/behavior_subject.dart' as _i2; +import 'package:survey/models/detailed_survey_info.dart' as _i3; +import 'package:survey/models/survey_info.dart' as _i7; +import 'package:survey/modules/survey_detail/survey_detail_module.dart' as _i4; +import 'package:survey/repositories/survey_repository.dart' as _i5; + +// ignore_for_file: comment_references +// ignore_for_file: unnecessary_parenthesis + +// ignore_for_file: prefer_const_constructors + +// ignore_for_file: avoid_redundant_argument_values + +class _FakeBehaviorSubject extends _i1.Fake + implements _i2.BehaviorSubject {} + +class _FakeDetailedSurveyInfo extends _i1.Fake + implements _i3.DetailedSurveyInfo {} + +/// A class which mocks [SurveyDetailInteractorDelegate]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSurveyDetailInteractorDelegate extends _i1.Mock + implements _i4.SurveyDetailInteractorDelegate { + MockSurveyDetailInteractorDelegate() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.BehaviorSubject<_i3.DetailedSurveyInfo> get detailedSurveyDidFetch => + (super.noSuchMethod(Invocation.getter(#detailedSurveyDidFetch), + returnValue: _FakeBehaviorSubject<_i3.DetailedSurveyInfo>()) + as _i2.BehaviorSubject<_i3.DetailedSurveyInfo>); + @override + _i2.BehaviorSubject get detailedSurveyDidFailToFetch => + (super.noSuchMethod(Invocation.getter(#detailedSurveyDidFailToFetch), + returnValue: _FakeBehaviorSubject()) + as _i2.BehaviorSubject); +} + +/// A class which mocks [SurveyRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSurveyRepository extends _i1.Mock implements _i5.SurveyRepository { + MockSurveyRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i6.Future get isSurveysCached => + (super.noSuchMethod(Invocation.getter(#isSurveysCached), + returnValue: Future.value(false)) as _i6.Future); + @override + _i6.Future> fetchSurveys({bool? force}) => + (super.noSuchMethod(Invocation.method(#fetchSurveys, [], {#force: force}), + returnValue: + Future>.value(<_i7.SurveyInfo>[])) + as _i6.Future>); + @override + _i6.Future<_i3.DetailedSurveyInfo> fetchDetailedSurvey(String? id) => + (super.noSuchMethod(Invocation.method(#fetchDetailedSurvey, [id]), + returnValue: Future<_i3.DetailedSurveyInfo>.value( + _FakeDetailedSurveyInfo())) + as _i6.Future<_i3.DetailedSurveyInfo>); +} diff --git a/test/modules/survey_detail/survey_detail_module_test.dart b/test/modules/survey_detail/survey_detail_module_test.dart new file mode 100644 index 00000000..b08d9084 --- /dev/null +++ b/test/modules/survey_detail/survey_detail_module_test.dart @@ -0,0 +1,27 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:quick_test/quick_test.dart'; +import 'package:survey/modules/survey_detail/survey_detail_module.dart'; + +import '../../mocks/build_context.dart'; + +void main() { + describe("a SurveyDetail module", () { + late SurveyDetailModule module; + beforeEach(() { + module = SurveyDetailModule(); + }); + + describe("it's build is called", () { + late Widget widget; + + beforeEach(() { + widget = module.build(MockBuildContext()); + }); + + it("returns SurveyDetailViewImpl", () { + expect(widget, isA()); + }); + }); + }); +} diff --git a/test/modules/survey_detail/survey_detail_presenter_test.dart b/test/modules/survey_detail/survey_detail_presenter_test.dart new file mode 100644 index 00000000..6fc42677 --- /dev/null +++ b/test/modules/survey_detail/survey_detail_presenter_test.dart @@ -0,0 +1,88 @@ +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:quick_test/quick_test.dart'; +import 'package:survey/models/detailed_survey_info.dart'; +import 'package:survey/models/survey_info.dart'; +import 'package:survey/modules/survey_detail/survey_detail_module.dart'; + +import '../../mocks/build_context.dart'; +import 'survey_detail_presenter_test.mocks.dart'; + +@GenerateMocks([SurveyDetailView, SurveyDetailRouter, SurveyDetailInteractor]) +void main() { + describe("a SurveyDetail presenter", () { + late SurveyDetailPresenterImpl presenter; + late MockSurveyDetailView view; + late MockSurveyDetailRouter router; + late MockSurveyDetailInteractor interactor; + late MockBuildContext buildContext; + final survey = SurveyInfo(); + + beforeEach(() { + buildContext = MockBuildContext(); + + view = MockSurveyDetailView(); + when(view.context).thenReturn(buildContext); + + router = MockSurveyDetailRouter(); + + interactor = MockSurveyDetailInteractor(); + when(interactor.survey).thenReturn(survey); + + presenter = SurveyDetailPresenterImpl(); + presenter.configure(view: view, interactor: interactor, router: router); + }); + + describe("it's detailedSurveyDidFailToFetch emits", () { + final exception = Exception(); + beforeEach(() { + presenter.detailedSurveyDidFailToFetch.add(exception); + }); + + it("triggers view to dismiss progress hud and alert error", () { + verify(view.dismissProgressHUD()).called(1); + verify(view.alert(exception)).called(1); + }); + }); + + describe("it's detailedSurveyDidFetch emits", () { + final survey = DetailedSurveyInfo(); + beforeEach(() { + presenter.detailedSurveyDidFetch.add(survey); + }); + + it("triggers view to dismiss progress hud", () { + verify(view.dismissProgressHUD()).called(1); + }); + + it("triggers router to push to Survey Questions screen", () { + verify( + router.pushToSurveyQuestionsScreen(buildContext, survey: survey)); + }); + }); + + describe("it's stateDidInit emits", () { + beforeEach(() { + presenter.stateDidInit.add(null); + }); + + it("triggers view to set survey", () { + verify(view.setSurvey(survey)).called(1); + }); + }); + + describe("it's startSurveyButtonDidTap emits", () { + beforeEach(() { + presenter.startSurveyButtonDidTap.add(null); + }); + + it("triggers view to dismiss progress hud", () { + verify(view.showProgressHUD()).called(1); + }); + + it("triggers interactor to fetch detailed survey", () { + verify(interactor.fetchDetailedSurvey()).called(1); + }); + }); + }); +} diff --git a/test/modules/survey_detail/survey_detail_presenter_test.mocks.dart b/test/modules/survey_detail/survey_detail_presenter_test.mocks.dart new file mode 100644 index 00000000..79776b97 --- /dev/null +++ b/test/modules/survey_detail/survey_detail_presenter_test.mocks.dart @@ -0,0 +1,106 @@ +// Mocks generated by Mockito 5.0.7 from annotations +// in survey/test/modules/survey_detail/survey_detail_presenter_test.dart. +// Do not manually edit this file. + +import 'package:flutter/src/widgets/framework.dart' as _i3; +import 'package:mockito/mockito.dart' as _i1; +import 'package:rxdart/src/subjects/behavior_subject.dart' as _i2; +import 'package:survey/models/detailed_survey_info.dart' as _i6; +import 'package:survey/models/survey_info.dart' as _i4; +import 'package:survey/modules/survey_detail/survey_detail_module.dart' as _i5; + +// ignore_for_file: comment_references +// ignore_for_file: unnecessary_parenthesis + +// ignore_for_file: prefer_const_constructors + +// ignore_for_file: avoid_redundant_argument_values + +class _FakeBehaviorSubject extends _i1.Fake + implements _i2.BehaviorSubject {} + +class _FakeBuildContext extends _i1.Fake implements _i3.BuildContext {} + +class _FakeSurveyInfo extends _i1.Fake implements _i4.SurveyInfo {} + +/// A class which mocks [SurveyDetailView]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSurveyDetailView extends _i1.Mock implements _i5.SurveyDetailView { + MockSurveyDetailView() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.BehaviorSubject get isProgressHUDShown => (super.noSuchMethod( + Invocation.getter(#isProgressHUDShown), + returnValue: _FakeBehaviorSubject()) as _i2.BehaviorSubject); + @override + set delegate(_i5.SurveyDetailViewDelegate? _delegate) => + super.noSuchMethod(Invocation.setter(#delegate, _delegate), + returnValueForMissingStub: null); + @override + _i3.BuildContext get context => + (super.noSuchMethod(Invocation.getter(#context), + returnValue: _FakeBuildContext()) as _i3.BuildContext); + @override + void setSurvey(_i4.SurveyInfo? survey) => + super.noSuchMethod(Invocation.method(#setSurvey, [survey]), + returnValueForMissingStub: null); + @override + void showProgressHUD() => + super.noSuchMethod(Invocation.method(#showProgressHUD, []), + returnValueForMissingStub: null); + @override + void dismissProgressHUD() => + super.noSuchMethod(Invocation.method(#dismissProgressHUD, []), + returnValueForMissingStub: null); + @override + void alert(Object? error) => + super.noSuchMethod(Invocation.method(#alert, [error]), + returnValueForMissingStub: null); +} + +/// A class which mocks [SurveyDetailRouter]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSurveyDetailRouter extends _i1.Mock + implements _i5.SurveyDetailRouter { + MockSurveyDetailRouter() { + _i1.throwOnMissingStub(this); + } + + @override + void pushToSurveyQuestionsScreen(_i3.BuildContext? context, + {_i6.DetailedSurveyInfo? survey}) => + super.noSuchMethod( + Invocation.method( + #pushToSurveyQuestionsScreen, [context], {#survey: survey}), + returnValueForMissingStub: null); +} + +/// A class which mocks [SurveyDetailInteractor]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSurveyDetailInteractor extends _i1.Mock + implements _i5.SurveyDetailInteractor { + MockSurveyDetailInteractor() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.SurveyInfo get survey => (super.noSuchMethod(Invocation.getter(#survey), + returnValue: _FakeSurveyInfo()) as _i4.SurveyInfo); + @override + set arguments(_i5.SurveyDetailArguments? _arguments) => + super.noSuchMethod(Invocation.setter(#arguments, _arguments), + returnValueForMissingStub: null); + @override + set delegate(_i5.SurveyDetailInteractorDelegate? _delegate) => + super.noSuchMethod(Invocation.setter(#delegate, _delegate), + returnValueForMissingStub: null); + @override + void fetchDetailedSurvey() => + super.noSuchMethod(Invocation.method(#fetchDetailedSurvey, []), + returnValueForMissingStub: null); +} diff --git a/test/modules/survey_detail/survey_detail_router_test.dart b/test/modules/survey_detail/survey_detail_router_test.dart new file mode 100644 index 00000000..581fb207 --- /dev/null +++ b/test/modules/survey_detail/survey_detail_router_test.dart @@ -0,0 +1,31 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:quick_test/quick_test.dart'; +import 'package:survey/models/detailed_survey_info.dart'; +import 'package:survey/modules/survey_detail/survey_detail_module.dart'; + +import '../../mocks/build_context.dart'; +import '../../mocks/navigator_state.dart'; + +void main() { + describe("a SurveyDetail router", () { + late SurveyDetailRouter router; + late MockBuildContext buildContext; + late MockNavigatorState navigatorState; + + beforeEach(() { + buildContext = MockBuildContext(); + navigatorState = MockNavigatorState(); + + router = SurveyDetailRouterImpl(); + }); + + describe("it's pushToSurveyQuestionsScreen is called", () { + beforeEach(() { + router.pushToSurveyQuestionsScreen(buildContext, + survey: DetailedSurveyInfo()); + }); + }); + }); +} diff --git a/test/modules/survey_detail/survey_detail_view_test.dart b/test/modules/survey_detail/survey_detail_view_test.dart new file mode 100644 index 00000000..3fe7ecc6 --- /dev/null +++ b/test/modules/survey_detail/survey_detail_view_test.dart @@ -0,0 +1,74 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:quick_test/quick_widget_test.dart'; +import 'package:survey/models/survey_info.dart'; +import 'package:survey/core/viper/module.dart'; +import 'package:mockito/mockito.dart'; +import 'package:survey/modules/survey_detail/survey_detail_module.dart'; +import '../../fakers/fake_module.dart'; +import '../../helpers/behavior_subject_generator.dart'; +import '../../helpers/extensions/widget_tester.dart'; +import 'survey_detail_view_test.mocks.dart'; + +@GenerateMocks([SurveyDetailViewDelegate]) +void main() { + describe("a SurveyDetail view", () { + late FakeModule module; + late MockSurveyDetailViewDelegate delegate; + late BehaviorSubjectGenerator generator; + final survey = SurveyInfo(); + survey.id = "id"; + survey.coverImageUrl = "https://example.com"; + survey.title = "title"; + survey.description = "description"; + + beforeEach((tester) async { + HttpOverrides.global = null; + generator = BehaviorSubjectGenerator(); + delegate = MockSurveyDetailViewDelegate(); + when(delegate.startSurveyButtonDidTap) + .thenAnswer((realInvocation) => generator.make(0)); + when(delegate.stateDidInit) + .thenAnswer((realInvocation) => generator.make(1)); + + module = FakeModule( + builder: () => const SurveyDetailViewImpl(), + delegate: delegate, + ); + ViewState.overriddenModule = module; + await tester.pumpModule(module); + await tester.pumpAndSettle(); + }); + + describe("it's setSurvey() is called", () { + beforeEach((tester) async { + module.view.setSurvey(survey); + await tester.pumpAndSettle(); + }); + + it("displays correct information", (tester) async { + expect(find.text(survey.title!), findsOneWidget); + expect(find.text(survey.description!), findsOneWidget); + + final provider = tester + .widget(find.byKey(SurveyDetailView.backgroundImageKey)) + .image as NetworkImage; + expect(provider.url, survey.coverImageUrl); + }); + }); + + describe("it's start survey button is tapped", () { + beforeEach((tester) async { + await tester.tap(find.byKey(SurveyDetailView.startSurveyButtonKey)); + }); + + it("triggers delegate's startSurveyButtonDidTap emits", (tester) async { + expect(delegate.startSurveyButtonDidTap, emits(null)); + }); + }); + }); +} diff --git a/test/modules/survey_detail/survey_detail_view_test.mocks.dart b/test/modules/survey_detail/survey_detail_view_test.mocks.dart new file mode 100644 index 00000000..8251c6ff --- /dev/null +++ b/test/modules/survey_detail/survey_detail_view_test.mocks.dart @@ -0,0 +1,40 @@ +// Mocks generated by Mockito 5.0.7 from annotations +// in survey/test/modules/survey_detail/survey_detail_view_test.dart. +// Do not manually edit this file. + +import 'package:mockito/mockito.dart' as _i1; +import 'package:rxdart/src/subjects/behavior_subject.dart' as _i2; +import 'package:survey/modules/survey_detail/survey_detail_module.dart' as _i3; + +// ignore_for_file: comment_references +// ignore_for_file: unnecessary_parenthesis + +// ignore_for_file: prefer_const_constructors + +// ignore_for_file: avoid_redundant_argument_values + +class _FakeBehaviorSubject extends _i1.Fake + implements _i2.BehaviorSubject {} + +/// A class which mocks [SurveyDetailViewDelegate]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSurveyDetailViewDelegate extends _i1.Mock + implements _i3.SurveyDetailViewDelegate { + MockSurveyDetailViewDelegate() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.BehaviorSubject get stateDidInit => (super.noSuchMethod( + Invocation.getter(#stateDidInit), + returnValue: _FakeBehaviorSubject()) as _i2.BehaviorSubject); + @override + _i2.BehaviorSubject get startSurveyButtonDidTap => (super.noSuchMethod( + Invocation.getter(#startSurveyButtonDidTap), + returnValue: _FakeBehaviorSubject()) as _i2.BehaviorSubject); + @override + _i2.BehaviorSubject get alertDialogDidClose => (super.noSuchMethod( + Invocation.getter(#alertDialogDidClose), + returnValue: _FakeBehaviorSubject()) as _i2.BehaviorSubject); +}