From 4b119d2c5b1653c583bbed56a66a9ec34e3e15b1 Mon Sep 17 00:00:00 2001 From: Tamara Slosarek Date: Fri, 20 Sep 2024 13:53:30 +0200 Subject: [PATCH] feat(app): add all not handled by guideline fallback case --- app/integration_test/drugs_test.dart | 48 ++++++++-------- .../fixtures/set_user_data.dart | 57 +++++++++++++++++++ .../fixtures/set_user_data_for_drug.dart | 41 ------------- app/lib/common/models/drug/drug.dart | 8 ++- 4 files changed, 87 insertions(+), 67 deletions(-) create mode 100644 app/integration_test/fixtures/set_user_data.dart delete mode 100644 app/integration_test/fixtures/set_user_data_for_drug.dart diff --git a/app/integration_test/drugs_test.dart b/app/integration_test/drugs_test.dart index 6d80a003..5d08b887 100644 --- a/app/integration_test/drugs_test.dart +++ b/app/integration_test/drugs_test.dart @@ -8,10 +8,11 @@ import 'package:mocktail/mocktail.dart'; import 'package:provider/provider.dart'; import 'fixtures/drugs/with_any_fallback_guideline.dart'; -import 'fixtures/drugs/with_multiple_any_not_handled_fallback_guidelines.dart'; +import 'fixtures/drugs/with_any_not_handled_guideline.dart'; +// import 'fixtures/drugs/with_multiple_any_not_handled_fallback_guidelines.dart'; import 'fixtures/drugs/with_proper_guideline.dart'; import 'fixtures/drugs/without_guidelines.dart'; -import 'fixtures/set_user_data_for_drug.dart'; +import 'fixtures/set_user_data.dart'; import 'mocks/drug_cubit.dart'; void main() { @@ -24,7 +25,7 @@ void main() { UserData.instance.activeDrugNames = []; UserData.instance.labData = null; UserData.instance.genotypeResults = null; - setUserDataForDrug(drugWithProperGuideline); + setUserDataForGuideline(drugWithProperGuideline.guidelines.first); mockDrugsCubit = MockDrugsCubit(); }); @@ -76,29 +77,26 @@ void main() { ); }); - testWidgets('test drug content with any not handled fallback guidelines', (tester) async { - // Work in progress; this should fail! - // Open TODOs: - // 1. Start with easy case (not pazopanib, add fixture for FDA w/ HLA-B) - // 2. Set user data for different guidelines and test that selected - // guidelines are different (may want to refactor set user data - // to be useful here) - // 3. Add all pazopanib guidelines for complex case - Future testPerGuideline(Drug drug) async { - for ( - final guideline in drug.guidelines - ) { - await _expectDrugContent( - tester, - mockDrugsCubit, - drug: drug, - guideline: guideline, - ); + testWidgets( + 'test drug content with any not handled fallback guidelines', + (tester) async { + Future testPerGuideline(Drug drug) async { + for ( + final guideline in drug.guidelines + ) { + setUserDataForGuideline(guideline); + await _expectDrugContent( + tester, + mockDrugsCubit, + drug: drug, + guideline: guideline, + ); + } } - } - // await testPerGuideline(drugWithAnyOtherFallbackGuideline); - await testPerGuideline(drugWithMultipleAnyNotHandledFallbackGuidelines); - }); + await testPerGuideline(drugWithAnyNotHandledFallbackGuideline); + // await testPerGuideline(drugWithMultipleAnyNotHandledFallbackGuidelines); + }, + ); }); } diff --git a/app/integration_test/fixtures/set_user_data.dart b/app/integration_test/fixtures/set_user_data.dart new file mode 100644 index 00000000..a2bd5799 --- /dev/null +++ b/app/integration_test/fixtures/set_user_data.dart @@ -0,0 +1,57 @@ +import 'package:app/common/module.dart'; + +class _UserDataConfig { + _UserDataConfig({ + required this.gene, + required this.lookupkey, + }); + final String gene; + final String lookupkey; + final String phenotype = 'phenotype does not matter for test'; + final String variant = 'variant does not matter for test'; + final String allelesTested = 'allelesTested does not matter for test'; +} + +void setUserDataForGuideline(Guideline guideline) { + UserData.instance.labData = UserData.instance.labData ?? []; + UserData.instance.genotypeResults = UserData.instance.genotypeResults ?? {}; + for (final gene in guideline.lookupkey.keys) { + final lookupkeys = guideline.lookupkey[gene]!; + if (lookupkeys.length != 1) { + debugPrint( + 'Warning: using only first lookupkey of ${lookupkeys.length} to set ' + 'user data', + ); + } + var lookupkey = lookupkeys.first; + if (lookupkey == '*' || lookupkey == '~') { + lookupkey = 'certainly not handled lookupkey'; + } + final userDataConfig = _UserDataConfig( + gene: gene, + lookupkey: lookupkey, + ); + // Need to be careful with non-unique genes here; e.g., is we want to use + // multiple HLA-B variants in the tests, we will need to check for the + // genotype key (which is in the current setup not possible without the + // variant) + UserData.instance.labData = UserData.instance.labData!.filter( + (labResult) => labResult.gene != gene + ).toList(); + UserData.instance.labData!.add( + LabResult( + gene: userDataConfig.gene, + variant: userDataConfig.variant, + phenotype: userDataConfig.phenotype, + allelesTested: userDataConfig.allelesTested, + ), + ); + UserData.instance.genotypeResults![userDataConfig.gene] = GenotypeResult( + gene: userDataConfig.gene, + phenotype: userDataConfig.phenotype, + variant: userDataConfig.variant, + allelesTested: userDataConfig.variant, + lookupkey: userDataConfig.lookupkey, + ); + } +} diff --git a/app/integration_test/fixtures/set_user_data_for_drug.dart b/app/integration_test/fixtures/set_user_data_for_drug.dart deleted file mode 100644 index 90571519..00000000 --- a/app/integration_test/fixtures/set_user_data_for_drug.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:app/common/models/drug/drug.dart'; -import 'package:app/common/models/userdata/genotype_result.dart'; -import 'package:app/common/models/userdata/lab_result.dart'; -import 'package:app/common/models/userdata/userdata.dart'; - -class _UserDataConfig { - _UserDataConfig({ - required this.gene, - required this.lookupkey, - }); - final String gene; - final String lookupkey; - final String phenotype = 'phenotype does not matter for test'; - final String variant = 'variant does not matter for test'; - final String allelesTested = 'allelesTested does not matter for test'; -} - -void setUserDataForDrug(Drug drug) { - UserData.instance.labData = UserData.instance.labData ?? []; - UserData.instance.genotypeResults = UserData.instance.genotypeResults ?? {}; - final userDataConfig = _UserDataConfig( - gene: drug.guidelines.first.lookupkey.keys.first, - lookupkey: - drug.guidelines.first.lookupkey.values.first.first, - ); - UserData.instance.labData!.add( - LabResult( - gene: userDataConfig.gene, - variant: userDataConfig.variant, - phenotype: userDataConfig.phenotype, - allelesTested: userDataConfig.allelesTested, - ), - ); - UserData.instance.genotypeResults![userDataConfig.gene] = GenotypeResult( - gene: userDataConfig.gene, - phenotype: userDataConfig.phenotype, - variant: userDataConfig.variant, - allelesTested: userDataConfig.variant, - lookupkey: userDataConfig.lookupkey, - ); -} \ No newline at end of file diff --git a/app/lib/common/models/drug/drug.dart b/app/lib/common/models/drug/drug.dart index 48dda486..58928a34 100644 --- a/app/lib/common/models/drug/drug.dart +++ b/app/lib/common/models/drug/drug.dart @@ -85,7 +85,7 @@ extension DrugExtension on Drug { ), ); if (anyFallbackGuideline != null) return anyFallbackGuideline; - return guidelines.firstOrNullWhere( + final exactGuideline = guidelines.firstOrNullWhere( (guideline) => guideline.lookupkey.all( (gene, variants) => variants.any((variant) => variants.contains(UserData.lookupFor( @@ -95,6 +95,12 @@ extension DrugExtension on Drug { )), ), ); + if (exactGuideline != null) return exactGuideline; + return guidelines.firstOrNullWhere( + (guideline) => guideline.lookupkey.all( + (gene, variants) => variants.any((variant) => variant == '~') + ), + ); } Guideline? get userOrFirstGuideline => userGuideline ??