@@ -715,12 +715,12 @@ public void updateTermsAndGenesInTaxon_whenUserHasNoGeneOrTerms() {
715
715
716
716
userService .updateTermsAndGenesInTaxon ( user , taxon , geneTierMap , terms );
717
717
718
- assertThatUserTermsAreEqualTo ( user , terms );
718
+ assertThatUserTermsAreEqualTo ( user , taxon , terms );
719
719
720
720
Map <Gene , TierType > expectedGenes = new HashMap <>( geneTierMap );
721
721
calculatedGenes .forEach ( g -> expectedGenes .putIfAbsent ( g , TierType .TIER3 ) );
722
722
723
- assertThatUserGenesAreEqualTo ( user , expectedGenes );
723
+ assertThatUserGenesAreEqualTo ( user , taxon , expectedGenes );
724
724
725
725
}
726
726
@@ -757,12 +757,70 @@ public void updateTermsAndGenesInTaxon_whenUserHasGenesAndTerms() {
757
757
758
758
userService .updateTermsAndGenesInTaxon ( user , taxon , geneTierMap , terms );
759
759
760
- assertThatUserTermsAreEqualTo ( user , terms );
760
+ assertThatUserTermsAreEqualTo ( user , taxon , terms );
761
761
762
762
Map <Gene , TierType > expectedGenes = new HashMap <>( geneTierMap );
763
763
calculatedGenes .forEach ( g -> expectedGenes .putIfAbsent ( g , TierType .TIER3 ) );
764
764
765
- assertThatUserGenesAreEqualTo ( user , expectedGenes );
765
+ assertThatUserGenesAreEqualTo ( user , taxon , expectedGenes );
766
+
767
+ }
768
+
769
+ @ Test
770
+ public void updateTermsAndGenesInTaxon_whenUserHasGenesAndTermsInMultipleTaxons () {
771
+ User user = createUser ( 1 );
772
+
773
+ Taxon taxon = createTaxon ( 1 );
774
+ Gene geneWillBeRemoved = createGene ( 999 , taxon );
775
+ GeneOntologyTerm termWillBeRemoved = createTermWithGene ( toGOId ( geneWillBeRemoved .getGeneId () ), geneWillBeRemoved );
776
+ user .getUserTerms ().add ( createUserTerm ( 1 , termWillBeRemoved , taxon ) );
777
+ user .getUserGenes ().put ( geneWillBeRemoved .getGeneId (), createUserGene ( 1 , geneWillBeRemoved , user , TierType .TIER1 ) );
778
+
779
+ Gene geneWillChangeTier = createGene ( 5 , taxon );
780
+ GeneOntologyTerm termWillRemain = createTermWithGene ( toGOId ( geneWillChangeTier .getGeneId () ), geneWillChangeTier );
781
+ user .getUserTerms ().add ( createUserTerm ( 2 , termWillRemain , taxon ) );
782
+ user .getUserGenes ().put ( geneWillChangeTier .getGeneId (), createUserGene ( 2 , geneWillChangeTier , user , TierType .TIER3 ) );
783
+
784
+ // Taxon 2
785
+ Taxon taxon2 = createTaxon ( 2 );
786
+ Gene geneOtherTaxon = createGene ( 9999 , taxon2 );
787
+ GeneOntologyTerm termOtherTaxon = createTermWithGene ( toGOId ( geneOtherTaxon .getGeneId () ), geneOtherTaxon );
788
+ user .getUserTerms ().add ( createUserTerm ( 3 , termOtherTaxon , taxon2 ) );
789
+ user .getUserGenes ().put ( geneOtherTaxon .getGeneId (), createUserGene ( 3 , geneOtherTaxon , user , TierType .TIER1 ) );
790
+
791
+ Gene geneOtherTaxon2 = createGene ( 5555 , taxon2 );
792
+ GeneOntologyTerm termOtherTaxon2 = createTermWithGene ( toGOId ( geneOtherTaxon2 .getGeneId () ), geneOtherTaxon2 );
793
+ user .getUserTerms ().add ( createUserTerm ( 4 , termOtherTaxon2 , taxon2 ) );
794
+ user .getUserGenes ().put ( geneOtherTaxon2 .getGeneId (), createUserGene ( 4 , geneOtherTaxon2 , user , TierType .TIER3 ) );
795
+
796
+ becomeUser ( user );
797
+
798
+ Collection <GeneOntologyTerm > terms = IntStream .range ( 1 , 10 ).boxed ().map (
799
+ nbr -> createTermWithGene ( toGOId ( nbr ), createGene ( nbr , taxon ) )
800
+ ).collect ( Collectors .toSet () );
801
+
802
+ Mockito .when ( goService .getGenes ( Mockito .anyCollectionOf ( GeneOntologyTerm .class ), Mockito .any () ) )
803
+ .then ( i -> {
804
+ Collection <GeneOntologyTerm > givenTerms = i .getArgumentAt ( 0 , Collection .class );
805
+ return givenTerms .stream ().flatMap ( t -> t .getDirectGenes ().stream () ).collect ( Collectors .toSet () );
806
+ } );
807
+
808
+ Map <Gene , TierType > geneTierMap = Maps .newHashMap ( geneWillChangeTier , TierType .TIER1 );
809
+
810
+ userService .updateTermsAndGenesInTaxon ( user , taxon , geneTierMap , terms );
811
+
812
+ assertThatUserTermsAreEqualTo ( user , taxon , terms );
813
+ assertThatUserTermsAreEqualTo ( user , taxon2 , Sets .newSet ( termOtherTaxon , termOtherTaxon2 ) );
814
+
815
+ Map <Gene , TierType > expectedGenes = new HashMap <>( geneTierMap );
816
+ terms .stream ().flatMap ( t -> t .getDirectGenes ().stream () ).forEach ( g -> expectedGenes .putIfAbsent ( g , TierType .TIER3 ) );
817
+
818
+ Map <Gene , TierType > expectedGenesTaxon2 = new HashMap <>();
819
+ expectedGenesTaxon2 .put ( geneOtherTaxon , TierType .TIER1 );
820
+ expectedGenesTaxon2 .put ( geneOtherTaxon2 , TierType .TIER3 );
821
+
822
+ assertThatUserGenesAreEqualTo ( user , taxon , expectedGenes );
823
+ assertThatUserGenesAreEqualTo ( user , taxon2 , expectedGenesTaxon2 );
766
824
767
825
}
768
826
@@ -788,12 +846,12 @@ public void updateTermsAndGenesInTaxon_whenManualAndCalculatedGenesOverlap_thenK
788
846
789
847
userService .updateTermsAndGenesInTaxon ( user , taxon , geneTierMap , terms );
790
848
791
- assertThatUserTermsAreEqualTo ( user , terms );
849
+ assertThatUserTermsAreEqualTo ( user , taxon , terms );
792
850
793
851
Map <Gene , TierType > expectedGenes = new HashMap <>( geneTierMap );
794
852
calculatedGenes .forEach ( g -> expectedGenes .putIfAbsent ( g , TierType .TIER3 ) );
795
853
796
- assertThatUserGenesAreEqualTo ( user , expectedGenes );
854
+ assertThatUserGenesAreEqualTo ( user , taxon , expectedGenes );
797
855
}
798
856
799
857
@ Test
@@ -827,12 +885,12 @@ public void updateTermsAndGenesInTaxon_whenOldAndNewOverlap_thenRetainIds() {
827
885
userService .updateTermsAndGenesInTaxon ( user , taxon , geneTierMap , terms );
828
886
829
887
// Might as well test this
830
- assertThatUserTermsAreEqualTo ( user , terms );
888
+ assertThatUserTermsAreEqualTo ( user , taxon , terms );
831
889
832
890
Map <Gene , TierType > expectedGenes = new HashMap <>( geneTierMap );
833
891
calculatedGenes .forEach ( g -> expectedGenes .putIfAbsent ( g , TierType .TIER3 ) );
834
892
835
- assertThatUserGenesAreEqualTo ( user , expectedGenes );
893
+ assertThatUserGenesAreEqualTo ( user , taxon , expectedGenes );
836
894
837
895
// This is really why we're here
838
896
assertThat ( user .getUserTerms ().iterator ().next ().getId () ).isEqualTo ( 1 );
@@ -873,16 +931,60 @@ public void updateTermsAndGenesInTaxon_whenUserHasGenesAndTerms_thenUpdateFreque
873
931
874
932
}
875
933
876
- private void assertThatUserTermsAreEqualTo ( User user , Collection <GeneOntologyTerm > terms ) {
877
- assertThat ( user .getUserTerms () ).hasSize ( terms .size () );
878
- assertThat ( user .getUserTerms ().stream ().map ( GeneOntologyTerm ::getGoId ).collect ( Collectors .toSet () ) )
934
+ @ Test
935
+ public void updateTermsAndGenesInTaxon_whenTermsOverlapInDifferentSpecies_thenKeepBothTerms () {
936
+ User user = createUser ( 1 );
937
+ Taxon taxon = createTaxon ( 1 );
938
+ Taxon taxon2 = createTaxon ( 2 );
939
+
940
+ // These should retain ids so that Hibernate does not delete and re insert rows
941
+ Gene geneInTaxon1 = createGene ( 5 , taxon );
942
+ GeneOntologyTerm termInTaxon1 = createTermWithGene ( toGOId ( geneInTaxon1 .getGeneId () ), geneInTaxon1 );
943
+ user .getUserTerms ().add ( createUserTerm ( 1 , termInTaxon1 , taxon ) );
944
+ user .getUserGenes ().put ( geneInTaxon1 .getGeneId (), createUserGene ( 1 , geneInTaxon1 , user , TierType .TIER3 ) );
945
+
946
+ Gene geneInTaxon2 = createGene ( 105 , taxon2 );
947
+ GeneOntologyTerm termInTaxon2 = createTermWithGene ( toGOId ( geneInTaxon2 .getGeneId () ), geneInTaxon2 );
948
+ user .getUserTerms ().add ( createUserTerm ( 2 , termInTaxon2 , taxon2 ) );
949
+ user .getUserGenes ().put ( geneInTaxon2 .getGeneId (), createUserGene ( 2 , geneInTaxon2 , user , TierType .TIER3 ) );
950
+
951
+ becomeUser ( user );
952
+
953
+ // Mock goService.getRelatedGenes
954
+ Collection <Gene > calculatedGenes = Collections .singleton ( createGene ( 205 , taxon ) );
955
+ Mockito .when ( goService .getGenes ( Mockito .anyCollectionOf ( GeneOntologyTerm .class ), Mockito .eq ( taxon ) ) ).thenReturn ( calculatedGenes );
956
+ Mockito .when ( goService .getGenes ( Mockito .anyCollectionOf ( GeneOntologyTerm .class ), Mockito .eq ( taxon2 ) ) ).thenReturn ( Collections .emptySet () );
957
+
958
+ // Attempting to add term to taxon 1 that is already present in taxon 2
959
+ Collection <GeneOntologyTerm > terms = Collections .singleton ( createTermWithGene ( toGOId ( 105 ), createGene ( 1005 , taxon ) ) );
960
+
961
+ Map <Gene , TierType > geneTierMap = terms .stream ()
962
+ .flatMap ( t -> t .getDirectGenes ().stream () )
963
+ .collect ( Collectors .toMap ( Function .identity (), g -> TierType .TIER1 ) );
964
+
965
+ userService .updateTermsAndGenesInTaxon ( user , taxon , geneTierMap , terms );
966
+
967
+ // Why we are here
968
+ assertThatUserTermsAreEqualTo ( user , taxon , terms );
969
+ assertThatUserTermsAreEqualTo ( user , taxon2 , Collections .singleton ( termInTaxon2 ));
970
+
971
+ Map <Gene , TierType > expectedGenes = new HashMap <>( geneTierMap );
972
+ calculatedGenes .forEach ( g -> expectedGenes .putIfAbsent ( g , TierType .TIER3 ) );
973
+
974
+ assertThatUserGenesAreEqualTo ( user , taxon , expectedGenes );
975
+ assertThatUserGenesAreEqualTo ( user , taxon2 , Maps .newHashMap ( geneInTaxon2 , TierType .TIER3 ) );
976
+
977
+ }
978
+
979
+ private void assertThatUserTermsAreEqualTo ( User user , Taxon taxon , Collection <GeneOntologyTerm > terms ) {
980
+ assertThat ( user .getUserTerms ().stream ().filter ( t -> t .getTaxon ().equals ( taxon ) ).count () ).isEqualTo ( terms .size () );
981
+ assertThat ( user .getUserTerms ().stream ().filter ( t -> t .getTaxon ().equals ( taxon ) ).map ( GeneOntologyTerm ::getGoId ).collect ( Collectors .toSet () ) )
879
982
.isEqualTo ( terms .stream ().map ( GeneOntologyTerm ::getGoId ).collect ( Collectors .toSet () ) );
880
983
}
881
984
882
- private void assertThatUserGenesAreEqualTo ( User user , Map <Gene , TierType > expectedGenes ) {
883
- assertThat ( user .getUserGenes ().keySet () )
884
- .containsExactlyElementsOf ( expectedGenes .keySet ().stream ().map ( Gene ::getGeneId )
885
- .collect ( Collectors .toSet () ) );
985
+ private void assertThatUserGenesAreEqualTo ( User user , Taxon taxon , Map <Gene , TierType > expectedGenes ) {
986
+ assertThat ( user .getGenesByTaxon ( taxon ) )
987
+ .containsExactlyElementsOf ( expectedGenes .keySet () );
886
988
expectedGenes .forEach ( ( g , tier ) -> assertThat ( user .getUserGenes ().get ( g .getGeneId () ).getTier () ).isEqualTo ( tier ) );
887
989
}
888
990
0 commit comments