@@ -684,3 +684,183 @@ def test_can_download_metadata(self):
684684 ).content .decode ()
685685 )
686686 self .assertEqual (response , scs .extra_metadata )
687+
688+ class TestVariantAPIViews (TestCase ):
689+ factory = VariantFactory
690+ url = "variants"
691+ variants_base_url = "/api/variants"
692+
693+ def setUp (self ):
694+ Variant .objects .all ().delete ()
695+
696+ def tearDown (self ):
697+ Variant .objects .all ().delete ()
698+
699+ def test_raises_400_error_missing_params (self ):
700+ response = self .client .get (f"{ self .variants_base_url } /NOT_A_REAL_URN" )
701+ self .assertEqual (response .status_code , 400 )
702+ variant = self .factory ()
703+ variant .save ()
704+ response = self .client .get (f"{ self .variants_base_url } /{ variant .urn } " )
705+ self .assertEqual (response .status_code , 400 )
706+
707+ def test_raises_404_error_missing_variant (self ):
708+ variant_id = 1
709+ response = self .client .get (
710+ f"{ self .variants_base_url } /NOT_A_REAL_URN?variant_id={ variant_id } "
711+ )
712+ self .assertEqual (response .status_code , 404 )
713+
714+ def test_can_get_response_for_variant (self ):
715+ variant = self .factory ()
716+ variant_urn = variant .urn
717+ variant_id = 1
718+ variant .urn = variant_urn + f'#{ variant_id } '
719+ variant .save ()
720+ response = self .client .get (
721+ f"{ self .variants_base_url } /{ variant_urn } ?variant_id={ variant_id } "
722+ )
723+ self .assertEqual (response .status_code , 200 )
724+ response_json = json .loads (response .content .decode ())
725+ self .assertEqual (
726+ len (response_json ['experiment' ]['scoreset' ]['variants' ]), 1
727+ )
728+
729+ def test_can_use_offset (self ):
730+ variant_fake_base_urn = 'tmp:abcdef123456'
731+ variants_count = 5
732+ offset = 3
733+ vs = [self .factory () for _ in range (variants_count )]
734+ for i in range (len (vs )):
735+ # Overwrite the variant's urn so they all share a urn_prefix
736+ v = vs [i ]
737+ v .urn = variant_fake_base_urn + f'#{ i } '
738+ v .save ()
739+ v = Variant .objects .get (urn = f'{ variant_fake_base_urn } #0' )
740+ response = self .client .get (
741+ f"{ self .variants_base_url } /{ variant_fake_base_urn } ?variant_id=0" \
742+ f"&offset={ offset } "
743+ )
744+ response_json = json .loads (response .content .decode ())
745+ self .assertEqual (
746+ len (response_json ['experiment' ]['scoreset' ]['variants' ]),
747+ variants_count - offset
748+ )
749+
750+ def test_can_use_limit (self ):
751+ variant_fake_base_urn = 'tmp:abcdef123456'
752+ variants_count = 5
753+ limit = 3
754+ vs = [self .factory () for _ in range (variants_count )]
755+ for i in range (len (vs )):
756+ v = vs [i ]
757+ v .urn = variant_fake_base_urn + f'#{ i } '
758+ v .save ()
759+
760+ response = self .client .get (
761+ f"{ self .variants_base_url } /{ variant_fake_base_urn } ?variant_id=0" \
762+ f"&limit={ limit } "
763+ )
764+ response_json = json .loads (response .content .decode ())
765+ self .assertEqual (
766+ len (response_json ['experiment' ]['scoreset' ]['variants' ]), limit
767+ )
768+
769+ def test_requested_variant_is_always_first (self ):
770+ """
771+ The desired behavior is that the requested variant is always
772+ returned, and is always returned first.
773+ """
774+ variant_fake_base_urn = 'tmp:abcdef123456'
775+ variants_count = 5
776+ vs = [self .factory () for _ in range (variants_count )]
777+ for i in range (len (vs )):
778+ v = vs [i ]
779+ v .urn = variant_fake_base_urn + f'#{ i } '
780+ v .save ()
781+
782+ requested_variant_id = 1
783+ # Make sure by default (no limit, no offset), the requested variant
784+ # is returned first.
785+ response = self .client .get (
786+ f"{ self .variants_base_url } /{ variant_fake_base_urn } " \
787+ f"?variant_id={ requested_variant_id } "
788+ )
789+ response_json = json .loads (response .content .decode ())
790+ self .assertEqual (
791+ response_json ['experiment' ]['scoreset' ]['variants' ][0 ]['urn' ],
792+ f'{ variant_fake_base_urn } #{ requested_variant_id } '
793+ )
794+
795+ # For some representative combinations of limits and offsets, make sure
796+ # the requested variant is still the first returned.
797+ limits_and_offsets = [(0 , 0 ), (0 , 3 ), (2 , 0 ), (5 , 0 ), (5 , 3 )]
798+ for limit_and_offset in limits_and_offsets :
799+ limit = limit_and_offset [0 ]
800+ offset = limit_and_offset [1 ]
801+ response = self .client .get (
802+ f"{ self .variants_base_url } /{ variant_fake_base_urn } " \
803+ f"?variant_id={ requested_variant_id } " \
804+ f"&limit={ limit } &offset={ offset } "
805+ )
806+ response_json = json .loads (response .content .decode ())
807+ self .assertEqual (
808+ response_json ['experiment' ]['scoreset' ]['variants' ][0 ]['urn' ],
809+ f'{ variant_fake_base_urn } #{ requested_variant_id } '
810+ )
811+
812+ def test_can_get_large_response_for_variant (self ):
813+ variant = self .factory ()
814+ variant_urn = variant .urn
815+ variant_id = 1
816+ variant .urn = variant_urn + f'#{ variant_id } '
817+ variant .save ()
818+ response = self .client .get (
819+ f"{ self .variants_base_url } /{ variant_urn } ?variant_id={ variant_id } " \
820+ "&limit=51"
821+ )
822+ self .assertEqual (response .status_code , 202 )
823+ response_json = json .loads (response .content .decode ())
824+ self .assertTrue ('results_uuid' in response_json )
825+
826+ response = self .client .get (
827+ f"{ self .variants_base_url } /{ variant_urn } ?variant_id={ variant_id } " \
828+ "&limit=-1"
829+ )
830+ self .assertEqual (response .status_code , 202 )
831+ response_json = json .loads (response .content .decode ())
832+ self .assertTrue ('results_uuid' in response_json )
833+
834+ class TestResultsAPIViews (TestCase ):
835+ factory = VariantFactory
836+ url = "results"
837+ variants_base_url = "/api/variants"
838+ results_base_url = "/api/results"
839+
840+ def setUp (self ):
841+ Variant .objects .all ().delete ()
842+
843+ def tearDown (self ):
844+ Variant .objects .all ().delete ()
845+
846+ def test_raises_404_missing_results_uuid (self ):
847+ response = self .client .get (
848+ f"{ self .results_base_url } /NOT_A_REAL_UUID"
849+ )
850+ self .assertEqual (response .status_code , 404 )
851+
852+ def test_can_get_zipfile (self ):
853+ variant = self .factory ()
854+ variant_urn = variant .urn
855+ variant_id = 1
856+ variant .urn = variant_urn + f'#{ variant_id } '
857+ variant .save ()
858+ response = self .client .get (
859+ f"{ self .variants_base_url } /{ variant_urn } ?variant_id={ variant_id } " \
860+ "&limit=51"
861+ )
862+ response_json = json .loads (response .content .decode ())
863+ results_uuid = response_json ['results_uuid' ]
864+
865+ response = self .client .get (f"{ self .results_base_url } /{ results_uuid } " )
866+ self .assertEqual (response .status_code , 200 )
0 commit comments