tangled
alpha
login
or
join now
eldridge.cam
/
cartography
0
fork
atom
Trading card city builder game?
0
fork
atom
overview
issues
pulls
pipelines
additional tests for other apis
eldridge.cam
1 month ago
bf4d3c5e
f6c66d6c
verified
This commit was signed with the committer's
known signature
.
eldridge.cam
SSH Key Fingerprint:
SHA256:MAgO4sya2MgvdgUjSGKAO0lQ9X2HQp1Jb+x/Tpeeims=
+384
-200
8 changed files
expand all
collapse all
unified
split
generated
schema.sql
packages
cartography
fixtures
seed.sql
src
api
errors
mod.rs
operations
get_banner.rs
list_banners.rs
list_card_types.rs
pull_banner.rs
test.rs
+120
-186
generated/schema.sql
···
20
20
SET row_security = off;
21
21
22
22
--
23
23
+
-- Name: _sqlx_test; Type: SCHEMA; Schema: -; Owner: -
24
24
+
--
25
25
+
26
26
+
CREATE SCHEMA _sqlx_test;
27
27
+
28
28
+
29
29
+
--
23
30
-- Name: citext; Type: EXTENSION; Schema: -; Owner: -
24
31
--
25
32
···
57
64
);
58
65
59
66
67
67
+
--
68
68
+
-- Name: database_ids; Type: SEQUENCE; Schema: _sqlx_test; Owner: -
69
69
+
--
70
70
+
71
71
+
CREATE SEQUENCE _sqlx_test.database_ids
72
72
+
START WITH 1
73
73
+
INCREMENT BY 1
74
74
+
NO MINVALUE
75
75
+
NO MAXVALUE
76
76
+
CACHE 1;
77
77
+
78
78
+
60
79
SET default_tablespace = '';
61
80
62
81
SET default_table_access_method = heap;
63
82
64
83
--
84
84
+
-- Name: databases; Type: TABLE; Schema: _sqlx_test; Owner: -
85
85
+
--
86
86
+
87
87
+
CREATE TABLE _sqlx_test.databases (
88
88
+
db_name text NOT NULL,
89
89
+
test_path text NOT NULL,
90
90
+
created_at timestamp with time zone DEFAULT now() NOT NULL
91
91
+
);
92
92
+
93
93
+
94
94
+
--
65
95
-- Name: accounts; Type: TABLE; Schema: public; Owner: -
66
96
--
67
97
68
98
CREATE TABLE public.accounts (
69
99
id public.citext NOT NULL,
70
70
-
CONSTRAINT accounts_id_check CHECK (
71
71
-
((0 < length((id)::text)) AND (length((id)::text) <= 64))
72
72
-
)
100
100
+
CONSTRAINT accounts_id_check CHECK (((0 < length((id)::text)) AND (length((id)::text) <= 64)))
73
101
);
74
102
75
103
···
104
132
CREATE TABLE public.card_sets (
105
133
id text NOT NULL,
106
134
release_date timestamp with time zone NOT NULL,
107
107
-
CONSTRAINT card_sets_id_check CHECK (
108
108
-
((0 < length(id)) AND (length(id) <= 64))
109
109
-
)
135
135
+
CONSTRAINT card_sets_id_check CHECK (((0 < length(id)) AND (length(id) <= 64)))
110
136
);
111
137
112
138
···
125
151
id text NOT NULL,
126
152
card_set_id text DEFAULT 'default'::text NOT NULL,
127
153
class public.card_class NOT NULL,
128
128
-
CONSTRAINT card_types_id_check CHECK (
129
129
-
((0 < length(id)) AND (length(id) <= 64))
130
130
-
)
154
154
+
CONSTRAINT card_types_id_check CHECK (((0 < length(id)) AND (length(id) <= 64)))
131
155
);
132
156
133
157
···
178
202
name text NOT NULL,
179
203
id bigint NOT NULL,
180
204
home_tile_id bigint,
181
181
-
CONSTRAINT citizens_name_check CHECK (
182
182
-
((0 < length(name)) AND (length(name) < 64))
183
183
-
)
205
205
+
CONSTRAINT citizens_name_check CHECK (((0 < length(name)) AND (length(name) < 64)))
184
206
);
185
207
186
208
···
239
261
id bigint NOT NULL,
240
262
name text NOT NULL,
241
263
account_id public.citext NOT NULL,
242
242
-
CONSTRAINT fields_name_check CHECK (
243
243
-
((0 < length(name)) AND (length(name) <= 64))
244
244
-
)
264
264
+
CONSTRAINT fields_name_check CHECK (((0 < length(name)) AND (length(name) <= 64)))
245
265
);
246
266
247
267
···
294
314
start_date timestamp with time zone NOT NULL,
295
315
end_date timestamp with time zone,
296
316
pack_size integer DEFAULT 5 NOT NULL,
297
297
-
CONSTRAINT pack_banners_id_check CHECK (
298
298
-
((0 < length(id)) AND (length(id) <= 64))
299
299
-
)
317
317
+
CONSTRAINT pack_banners_id_check CHECK (((0 < length(id)) AND (length(id) <= 64)))
300
318
);
301
319
302
320
···
380
398
381
399
CREATE TABLE public.resources (
382
400
id text NOT NULL,
383
383
-
CONSTRAINT resources_id_check CHECK (
384
384
-
((0 < length(id)) AND (length(id) <= 64))
385
385
-
)
401
401
+
CONSTRAINT resources_id_check CHECK (((0 < length(id)) AND (length(id) <= 64)))
386
402
);
387
403
388
404
···
399
415
400
416
CREATE TABLE public.species (
401
417
id text NOT NULL,
402
402
-
class public.card_class GENERATED ALWAYS AS (
403
403
-
'citizen'::public.card_class
404
404
-
) STORED NOT NULL,
405
405
-
CONSTRAINT species_id_check CHECK (
406
406
-
((0 < length(id)) AND (length(id) <= 64))
407
407
-
)
418
418
+
class public.card_class GENERATED ALWAYS AS ('citizen'::public.card_class) STORED NOT NULL,
419
419
+
CONSTRAINT species_id_check CHECK (((0 < length(id)) AND (length(id) <= 64)))
408
420
);
409
421
410
422
···
478
490
479
491
CREATE TABLE public.tile_types (
480
492
id text NOT NULL,
481
481
-
class public.card_class GENERATED ALWAYS AS (
482
482
-
'tile'::public.card_class
483
483
-
) STORED NOT NULL,
493
493
+
class public.card_class GENERATED ALWAYS AS ('tile'::public.card_class) STORED NOT NULL,
484
494
category public.tile_category NOT NULL,
485
495
houses integer NOT NULL,
486
496
employs integer NOT NULL
···
502
512
id bigint NOT NULL,
503
513
tile_type_id text NOT NULL,
504
514
name text NOT NULL,
505
505
-
CONSTRAINT tiles_name_check CHECK (
506
506
-
((0 < length(name)) AND (length(name) <= 64))
507
507
-
)
515
515
+
CONSTRAINT tiles_name_check CHECK (((0 < length(name)) AND (length(name) <= 64)))
508
516
);
509
517
510
518
···
516
524
517
525
518
526
--
527
527
+
-- Name: databases databases_pkey; Type: CONSTRAINT; Schema: _sqlx_test; Owner: -
528
528
+
--
529
529
+
530
530
+
ALTER TABLE ONLY _sqlx_test.databases
531
531
+
ADD CONSTRAINT databases_pkey PRIMARY KEY (db_name);
532
532
+
533
533
+
534
534
+
--
519
535
-- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
520
536
--
521
537
522
538
ALTER TABLE ONLY public.accounts
523
523
-
ADD CONSTRAINT accounts_pkey PRIMARY KEY (id);
539
539
+
ADD CONSTRAINT accounts_pkey PRIMARY KEY (id);
524
540
525
541
526
542
--
···
528
544
--
529
545
530
546
ALTER TABLE ONLY public.card_accounts
531
531
-
ADD CONSTRAINT card_accounts_card_id_account_id_key UNIQUE (
532
532
-
card_id, account_id
533
533
-
);
547
547
+
ADD CONSTRAINT card_accounts_card_id_account_id_key UNIQUE (card_id, account_id);
534
548
535
549
536
550
--
···
538
552
--
539
553
540
554
ALTER TABLE ONLY public.card_accounts
541
541
-
ADD CONSTRAINT card_accounts_pkey PRIMARY KEY (card_id);
555
555
+
ADD CONSTRAINT card_accounts_pkey PRIMARY KEY (card_id);
542
556
543
557
544
558
--
···
546
560
--
547
561
548
562
ALTER TABLE ONLY public.card_sets
549
549
-
ADD CONSTRAINT card_sets_pkey PRIMARY KEY (id);
563
563
+
ADD CONSTRAINT card_sets_pkey PRIMARY KEY (id);
550
564
551
565
552
566
--
···
554
568
--
555
569
556
570
ALTER TABLE ONLY public.card_types
557
557
-
ADD CONSTRAINT card_types_id_class_key UNIQUE (id, class);
571
571
+
ADD CONSTRAINT card_types_id_class_key UNIQUE (id, class);
558
572
559
573
560
574
--
···
562
576
--
563
577
564
578
ALTER TABLE ONLY public.card_types
565
565
-
ADD CONSTRAINT card_types_pkey PRIMARY KEY (id);
579
579
+
ADD CONSTRAINT card_types_pkey PRIMARY KEY (id);
566
580
567
581
568
582
--
···
570
584
--
571
585
572
586
ALTER TABLE ONLY public.cards
573
573
-
ADD CONSTRAINT cards_id_card_type_id_key UNIQUE (id, card_type_id);
587
587
+
ADD CONSTRAINT cards_id_card_type_id_key UNIQUE (id, card_type_id);
574
588
575
589
576
590
--
···
578
592
--
579
593
580
594
ALTER TABLE ONLY public.cards
581
581
-
ADD CONSTRAINT cards_pkey PRIMARY KEY (id);
595
595
+
ADD CONSTRAINT cards_pkey PRIMARY KEY (id);
582
596
583
597
584
598
--
···
586
600
--
587
601
588
602
ALTER TABLE ONLY public.citizens
589
589
-
ADD CONSTRAINT citizens_pkey PRIMARY KEY (id);
603
603
+
ADD CONSTRAINT citizens_pkey PRIMARY KEY (id);
590
604
591
605
592
606
--
···
594
608
--
595
609
596
610
ALTER TABLE ONLY public.field_citizens
597
597
-
ADD CONSTRAINT field_citizens_pkey PRIMARY KEY (citizen_id);
611
611
+
ADD CONSTRAINT field_citizens_pkey PRIMARY KEY (citizen_id);
598
612
599
613
600
614
--
···
602
616
--
603
617
604
618
ALTER TABLE ONLY public.field_tiles
605
605
-
ADD CONSTRAINT field_tiles_pkey PRIMARY KEY (tile_id);
619
619
+
ADD CONSTRAINT field_tiles_pkey PRIMARY KEY (tile_id);
606
620
607
621
608
622
--
···
610
624
--
611
625
612
626
ALTER TABLE ONLY public.fields
613
613
-
ADD CONSTRAINT fields_id_account_id_key UNIQUE (id, account_id);
627
627
+
ADD CONSTRAINT fields_id_account_id_key UNIQUE (id, account_id);
614
628
615
629
616
630
--
···
618
632
--
619
633
620
634
ALTER TABLE ONLY public.fields
621
621
-
ADD CONSTRAINT fields_pkey PRIMARY KEY (id);
635
635
+
ADD CONSTRAINT fields_pkey PRIMARY KEY (id);
622
636
623
637
624
638
--
···
626
640
--
627
641
628
642
ALTER TABLE ONLY public.pack_banner_cards
629
629
-
ADD CONSTRAINT pack_banner_cards_pkey PRIMARY KEY (
630
630
-
pack_banner_id, card_type_id
631
631
-
);
643
643
+
ADD CONSTRAINT pack_banner_cards_pkey PRIMARY KEY (pack_banner_id, card_type_id);
632
644
633
645
634
646
--
···
636
648
--
637
649
638
650
ALTER TABLE ONLY public.pack_banners
639
639
-
ADD CONSTRAINT pack_banners_pkey PRIMARY KEY (id);
651
651
+
ADD CONSTRAINT pack_banners_pkey PRIMARY KEY (id);
640
652
641
653
642
654
--
···
644
656
--
645
657
646
658
ALTER TABLE ONLY public.pack_contents
647
647
-
ADD CONSTRAINT pack_contents_pkey PRIMARY KEY (pack_id, "position");
659
659
+
ADD CONSTRAINT pack_contents_pkey PRIMARY KEY (pack_id, "position");
648
660
649
661
650
662
--
···
652
664
--
653
665
654
666
ALTER TABLE ONLY public.packs
655
655
-
ADD CONSTRAINT packs_pkey PRIMARY KEY (id);
667
667
+
ADD CONSTRAINT packs_pkey PRIMARY KEY (id);
656
668
657
669
658
670
--
···
660
672
--
661
673
662
674
ALTER TABLE ONLY public.resources
663
663
-
ADD CONSTRAINT resources_pkey PRIMARY KEY (id);
675
675
+
ADD CONSTRAINT resources_pkey PRIMARY KEY (id);
664
676
665
677
666
678
--
···
668
680
--
669
681
670
682
ALTER TABLE ONLY public.species_needs
671
671
-
ADD CONSTRAINT species_needs_pkey PRIMARY KEY (species_id, resource_id);
683
683
+
ADD CONSTRAINT species_needs_pkey PRIMARY KEY (species_id, resource_id);
672
684
673
685
674
686
--
···
676
688
--
677
689
678
690
ALTER TABLE ONLY public.species
679
679
-
ADD CONSTRAINT species_pkey PRIMARY KEY (id);
691
691
+
ADD CONSTRAINT species_pkey PRIMARY KEY (id);
680
692
681
693
682
694
--
···
684
696
--
685
697
686
698
ALTER TABLE ONLY public.tile_type_consumes
687
687
-
ADD CONSTRAINT tile_type_consumes_pkey PRIMARY KEY (tile_type_id, resource_id);
699
699
+
ADD CONSTRAINT tile_type_consumes_pkey PRIMARY KEY (tile_type_id, resource_id);
688
700
689
701
690
702
--
···
692
704
--
693
705
694
706
ALTER TABLE ONLY public.tile_type_produces
695
695
-
ADD CONSTRAINT tile_type_produces_pkey PRIMARY KEY (tile_type_id, resource_id);
707
707
+
ADD CONSTRAINT tile_type_produces_pkey PRIMARY KEY (tile_type_id, resource_id);
696
708
697
709
698
710
--
···
700
712
--
701
713
702
714
ALTER TABLE ONLY public.tile_types
703
703
-
ADD CONSTRAINT tile_types_pkey PRIMARY KEY (id);
715
715
+
ADD CONSTRAINT tile_types_pkey PRIMARY KEY (id);
704
716
705
717
706
718
--
···
708
720
--
709
721
710
722
ALTER TABLE ONLY public.tiles
711
711
-
ADD CONSTRAINT tiles_pkey PRIMARY KEY (id);
723
723
+
ADD CONSTRAINT tiles_pkey PRIMARY KEY (id);
724
724
+
725
725
+
726
726
+
--
727
727
+
-- Name: databases_created_at; Type: INDEX; Schema: _sqlx_test; Owner: -
728
728
+
--
729
729
+
730
730
+
CREATE INDEX databases_created_at ON _sqlx_test.databases USING btree (created_at);
712
731
713
732
714
733
--
715
734
-- Name: card_accounts_account_id_index; Type: INDEX; Schema: public; Owner: -
716
735
--
717
736
718
718
-
CREATE INDEX card_accounts_account_id_index ON public.card_accounts USING btree (
719
719
-
account_id
720
720
-
);
737
737
+
CREATE INDEX card_accounts_account_id_index ON public.card_accounts USING btree (account_id);
721
738
722
739
723
740
--
···
725
742
--
726
743
727
744
ALTER TABLE ONLY public.card_accounts
728
728
-
ADD CONSTRAINT card_accounts_account_id_fkey FOREIGN KEY (
729
729
-
account_id
730
730
-
) REFERENCES public.accounts (id) ON UPDATE CASCADE ON DELETE CASCADE;
745
745
+
ADD CONSTRAINT card_accounts_account_id_fkey FOREIGN KEY (account_id) REFERENCES public.accounts(id) ON UPDATE CASCADE ON DELETE CASCADE;
731
746
732
747
733
748
--
···
735
750
--
736
751
737
752
ALTER TABLE ONLY public.card_accounts
738
738
-
ADD CONSTRAINT card_accounts_card_id_fkey FOREIGN KEY (
739
739
-
card_id
740
740
-
) REFERENCES public.cards (id) ON UPDATE CASCADE ON DELETE CASCADE;
753
753
+
ADD CONSTRAINT card_accounts_card_id_fkey FOREIGN KEY (card_id) REFERENCES public.cards(id) ON UPDATE CASCADE ON DELETE CASCADE;
741
754
742
755
743
756
--
···
745
758
--
746
759
747
760
ALTER TABLE ONLY public.card_types
748
748
-
ADD CONSTRAINT card_types_card_set_id_fkey FOREIGN KEY (
749
749
-
card_set_id
750
750
-
) REFERENCES public.card_sets (id) ON UPDATE CASCADE ON DELETE RESTRICT;
761
761
+
ADD CONSTRAINT card_types_card_set_id_fkey FOREIGN KEY (card_set_id) REFERENCES public.card_sets(id) ON UPDATE CASCADE ON DELETE RESTRICT;
751
762
752
763
753
764
--
···
755
766
--
756
767
757
768
ALTER TABLE ONLY public.cards
758
758
-
ADD CONSTRAINT cards_card_type_id_fkey FOREIGN KEY (
759
759
-
card_type_id
760
760
-
) REFERENCES public.card_types (id) ON UPDATE CASCADE ON DELETE RESTRICT;
769
769
+
ADD CONSTRAINT cards_card_type_id_fkey FOREIGN KEY (card_type_id) REFERENCES public.card_types(id) ON UPDATE CASCADE ON DELETE RESTRICT;
761
770
762
771
763
772
--
···
765
774
--
766
775
767
776
ALTER TABLE ONLY public.citizens
768
768
-
ADD CONSTRAINT citizens_home_tile_id_fkey FOREIGN KEY (
769
769
-
home_tile_id
770
770
-
) REFERENCES public.tiles (id) ON UPDATE CASCADE ON DELETE SET NULL;
777
777
+
ADD CONSTRAINT citizens_home_tile_id_fkey FOREIGN KEY (home_tile_id) REFERENCES public.tiles(id) ON UPDATE CASCADE ON DELETE SET NULL;
771
778
772
779
773
780
--
···
775
782
--
776
783
777
784
ALTER TABLE ONLY public.citizens
778
778
-
ADD CONSTRAINT citizens_id_fkey FOREIGN KEY (id) REFERENCES public.cards (
779
779
-
id
780
780
-
) ON UPDATE CASCADE ON DELETE CASCADE;
785
785
+
ADD CONSTRAINT citizens_id_fkey FOREIGN KEY (id) REFERENCES public.cards(id) ON UPDATE CASCADE ON DELETE CASCADE;
781
786
782
787
783
788
--
···
785
790
--
786
791
787
792
ALTER TABLE ONLY public.citizens
788
788
-
ADD CONSTRAINT citizens_id_species_id_fkey FOREIGN KEY (
789
789
-
id, species_id
790
790
-
) REFERENCES public.cards (
791
791
-
id, card_type_id
792
792
-
) ON UPDATE CASCADE ON DELETE CASCADE;
793
793
+
ADD CONSTRAINT citizens_id_species_id_fkey FOREIGN KEY (id, species_id) REFERENCES public.cards(id, card_type_id) ON UPDATE CASCADE ON DELETE CASCADE;
793
794
794
795
795
796
--
···
797
798
--
798
799
799
800
ALTER TABLE ONLY public.citizens
800
800
-
ADD CONSTRAINT citizens_species_id_fkey FOREIGN KEY (
801
801
-
species_id
802
802
-
) REFERENCES public.species (id) ON UPDATE CASCADE ON DELETE CASCADE;
801
801
+
ADD CONSTRAINT citizens_species_id_fkey FOREIGN KEY (species_id) REFERENCES public.species(id) ON UPDATE CASCADE ON DELETE CASCADE;
803
802
804
803
805
804
--
···
807
806
--
808
807
809
808
ALTER TABLE ONLY public.field_citizens
810
810
-
ADD CONSTRAINT field_citizens_account_id_citizen_id_fkey FOREIGN KEY (
811
811
-
account_id, citizen_id
812
812
-
) REFERENCES public.card_accounts (
813
813
-
account_id, card_id
814
814
-
) ON UPDATE CASCADE ON DELETE CASCADE;
809
809
+
ADD CONSTRAINT field_citizens_account_id_citizen_id_fkey FOREIGN KEY (account_id, citizen_id) REFERENCES public.card_accounts(account_id, card_id) ON UPDATE CASCADE ON DELETE CASCADE;
815
810
816
811
817
812
--
···
819
814
--
820
815
821
816
ALTER TABLE ONLY public.field_citizens
822
822
-
ADD CONSTRAINT field_citizens_account_id_field_id_fkey FOREIGN KEY (
823
823
-
account_id, field_id
824
824
-
) REFERENCES public.fields (account_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
817
817
+
ADD CONSTRAINT field_citizens_account_id_field_id_fkey FOREIGN KEY (account_id, field_id) REFERENCES public.fields(account_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
825
818
826
819
827
820
--
···
829
822
--
830
823
831
824
ALTER TABLE ONLY public.field_citizens
832
832
-
ADD CONSTRAINT field_citizens_account_id_fkey FOREIGN KEY (
833
833
-
account_id
834
834
-
) REFERENCES public.accounts (id) ON UPDATE CASCADE ON DELETE CASCADE;
825
825
+
ADD CONSTRAINT field_citizens_account_id_fkey FOREIGN KEY (account_id) REFERENCES public.accounts(id) ON UPDATE CASCADE ON DELETE CASCADE;
835
826
836
827
837
828
--
···
839
830
--
840
831
841
832
ALTER TABLE ONLY public.field_citizens
842
842
-
ADD CONSTRAINT field_citizens_citizen_id_fkey FOREIGN KEY (
843
843
-
citizen_id
844
844
-
) REFERENCES public.citizens (id) ON UPDATE CASCADE ON DELETE CASCADE;
833
833
+
ADD CONSTRAINT field_citizens_citizen_id_fkey FOREIGN KEY (citizen_id) REFERENCES public.citizens(id) ON UPDATE CASCADE ON DELETE CASCADE;
845
834
846
835
847
836
--
···
849
838
--
850
839
851
840
ALTER TABLE ONLY public.field_citizens
852
852
-
ADD CONSTRAINT field_citizens_field_id_fkey FOREIGN KEY (
853
853
-
field_id
854
854
-
) REFERENCES public.fields (id) ON UPDATE CASCADE ON DELETE CASCADE;
841
841
+
ADD CONSTRAINT field_citizens_field_id_fkey FOREIGN KEY (field_id) REFERENCES public.fields(id) ON UPDATE CASCADE ON DELETE CASCADE;
855
842
856
843
857
844
--
···
859
846
--
860
847
861
848
ALTER TABLE ONLY public.field_tiles
862
862
-
ADD CONSTRAINT field_tiles_account_id_field_id_fkey FOREIGN KEY (
863
863
-
account_id, field_id
864
864
-
) REFERENCES public.fields (account_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
849
849
+
ADD CONSTRAINT field_tiles_account_id_field_id_fkey FOREIGN KEY (account_id, field_id) REFERENCES public.fields(account_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
865
850
866
851
867
852
--
···
869
854
--
870
855
871
856
ALTER TABLE ONLY public.field_tiles
872
872
-
ADD CONSTRAINT field_tiles_account_id_fkey FOREIGN KEY (
873
873
-
account_id
874
874
-
) REFERENCES public.accounts (id) ON UPDATE CASCADE ON DELETE CASCADE;
857
857
+
ADD CONSTRAINT field_tiles_account_id_fkey FOREIGN KEY (account_id) REFERENCES public.accounts(id) ON UPDATE CASCADE ON DELETE CASCADE;
875
858
876
859
877
860
--
···
879
862
--
880
863
881
864
ALTER TABLE ONLY public.field_tiles
882
882
-
ADD CONSTRAINT field_tiles_account_id_tile_id_fkey FOREIGN KEY (
883
883
-
account_id, tile_id
884
884
-
) REFERENCES public.card_accounts (
885
885
-
account_id, card_id
886
886
-
) ON UPDATE CASCADE ON DELETE CASCADE;
865
865
+
ADD CONSTRAINT field_tiles_account_id_tile_id_fkey FOREIGN KEY (account_id, tile_id) REFERENCES public.card_accounts(account_id, card_id) ON UPDATE CASCADE ON DELETE CASCADE;
887
866
888
867
889
868
--
···
891
870
--
892
871
893
872
ALTER TABLE ONLY public.field_tiles
894
894
-
ADD CONSTRAINT field_tiles_field_id_fkey FOREIGN KEY (
895
895
-
field_id
896
896
-
) REFERENCES public.fields (id) ON UPDATE CASCADE ON DELETE CASCADE;
873
873
+
ADD CONSTRAINT field_tiles_field_id_fkey FOREIGN KEY (field_id) REFERENCES public.fields(id) ON UPDATE CASCADE ON DELETE CASCADE;
897
874
898
875
899
876
--
···
901
878
--
902
879
903
880
ALTER TABLE ONLY public.field_tiles
904
904
-
ADD CONSTRAINT field_tiles_tile_id_fkey FOREIGN KEY (
905
905
-
tile_id
906
906
-
) REFERENCES public.tiles (id) ON UPDATE CASCADE ON DELETE CASCADE;
881
881
+
ADD CONSTRAINT field_tiles_tile_id_fkey FOREIGN KEY (tile_id) REFERENCES public.tiles(id) ON UPDATE CASCADE ON DELETE CASCADE;
907
882
908
883
909
884
--
···
911
886
--
912
887
913
888
ALTER TABLE ONLY public.fields
914
914
-
ADD CONSTRAINT fields_account_id_fkey FOREIGN KEY (
915
915
-
account_id
916
916
-
) REFERENCES public.accounts (id) ON UPDATE CASCADE ON DELETE CASCADE;
889
889
+
ADD CONSTRAINT fields_account_id_fkey FOREIGN KEY (account_id) REFERENCES public.accounts(id) ON UPDATE CASCADE ON DELETE CASCADE;
917
890
918
891
919
892
--
···
921
894
--
922
895
923
896
ALTER TABLE ONLY public.pack_banner_cards
924
924
-
ADD CONSTRAINT pack_banner_cards_card_type_id_fkey FOREIGN KEY (
925
925
-
card_type_id
926
926
-
) REFERENCES public.card_types (id) ON UPDATE CASCADE ON DELETE RESTRICT;
897
897
+
ADD CONSTRAINT pack_banner_cards_card_type_id_fkey FOREIGN KEY (card_type_id) REFERENCES public.card_types(id) ON UPDATE CASCADE ON DELETE RESTRICT;
927
898
928
899
929
900
--
···
931
902
--
932
903
933
904
ALTER TABLE ONLY public.pack_banner_cards
934
934
-
ADD CONSTRAINT pack_banner_cards_pack_banner_id_fkey FOREIGN KEY (
935
935
-
pack_banner_id
936
936
-
) REFERENCES public.pack_banners (id) ON UPDATE CASCADE ON DELETE CASCADE;
905
905
+
ADD CONSTRAINT pack_banner_cards_pack_banner_id_fkey FOREIGN KEY (pack_banner_id) REFERENCES public.pack_banners(id) ON UPDATE CASCADE ON DELETE CASCADE;
937
906
938
907
939
908
--
···
941
910
--
942
911
943
912
ALTER TABLE ONLY public.pack_contents
944
944
-
ADD CONSTRAINT pack_contents_card_id_fkey FOREIGN KEY (
945
945
-
card_id
946
946
-
) REFERENCES public.cards (id) ON UPDATE CASCADE ON DELETE CASCADE;
913
913
+
ADD CONSTRAINT pack_contents_card_id_fkey FOREIGN KEY (card_id) REFERENCES public.cards(id) ON UPDATE CASCADE ON DELETE CASCADE;
947
914
948
915
949
916
--
···
951
918
--
952
919
953
920
ALTER TABLE ONLY public.pack_contents
954
954
-
ADD CONSTRAINT pack_contents_pack_id_fkey FOREIGN KEY (
955
955
-
pack_id
956
956
-
) REFERENCES public.packs (id) ON UPDATE CASCADE ON DELETE CASCADE;
921
921
+
ADD CONSTRAINT pack_contents_pack_id_fkey FOREIGN KEY (pack_id) REFERENCES public.packs(id) ON UPDATE CASCADE ON DELETE CASCADE;
957
922
958
923
959
924
--
···
961
926
--
962
927
963
928
ALTER TABLE ONLY public.packs
964
964
-
ADD CONSTRAINT packs_account_id_fkey FOREIGN KEY (
965
965
-
account_id
966
966
-
) REFERENCES public.accounts (id) ON UPDATE CASCADE ON DELETE CASCADE;
929
929
+
ADD CONSTRAINT packs_account_id_fkey FOREIGN KEY (account_id) REFERENCES public.accounts(id) ON UPDATE CASCADE ON DELETE CASCADE;
967
930
968
931
969
932
--
···
971
934
--
972
935
973
936
ALTER TABLE ONLY public.packs
974
974
-
ADD CONSTRAINT packs_pack_banner_id_fkey FOREIGN KEY (
975
975
-
pack_banner_id
976
976
-
) REFERENCES public.pack_banners (id) ON UPDATE CASCADE ON DELETE RESTRICT;
937
937
+
ADD CONSTRAINT packs_pack_banner_id_fkey FOREIGN KEY (pack_banner_id) REFERENCES public.pack_banners(id) ON UPDATE CASCADE ON DELETE RESTRICT;
977
938
978
939
979
940
--
···
981
942
--
982
943
983
944
ALTER TABLE ONLY public.species
984
984
-
ADD CONSTRAINT species_id_class_fkey FOREIGN KEY (
985
985
-
id, class
986
986
-
) REFERENCES public.card_types (id, class) ON UPDATE RESTRICT ON DELETE CASCADE;
945
945
+
ADD CONSTRAINT species_id_class_fkey FOREIGN KEY (id, class) REFERENCES public.card_types(id, class) ON UPDATE RESTRICT ON DELETE CASCADE;
987
946
988
947
989
948
--
···
991
950
--
992
951
993
952
ALTER TABLE ONLY public.species
994
994
-
ADD CONSTRAINT species_id_fkey FOREIGN KEY (id) REFERENCES public.card_types (
995
995
-
id
996
996
-
) ON UPDATE CASCADE ON DELETE CASCADE;
953
953
+
ADD CONSTRAINT species_id_fkey FOREIGN KEY (id) REFERENCES public.card_types(id) ON UPDATE CASCADE ON DELETE CASCADE;
997
954
998
955
999
956
--
···
1001
958
--
1002
959
1003
960
ALTER TABLE ONLY public.species_needs
1004
1004
-
ADD CONSTRAINT species_needs_resource_id_fkey FOREIGN KEY (
1005
1005
-
resource_id
1006
1006
-
) REFERENCES public.resources (id) ON UPDATE CASCADE ON DELETE RESTRICT;
961
961
+
ADD CONSTRAINT species_needs_resource_id_fkey FOREIGN KEY (resource_id) REFERENCES public.resources(id) ON UPDATE CASCADE ON DELETE RESTRICT;
1007
962
1008
963
1009
964
--
···
1011
966
--
1012
967
1013
968
ALTER TABLE ONLY public.species_needs
1014
1014
-
ADD CONSTRAINT species_needs_species_id_fkey FOREIGN KEY (
1015
1015
-
species_id
1016
1016
-
) REFERENCES public.species (id) ON UPDATE CASCADE ON DELETE CASCADE;
969
969
+
ADD CONSTRAINT species_needs_species_id_fkey FOREIGN KEY (species_id) REFERENCES public.species(id) ON UPDATE CASCADE ON DELETE CASCADE;
1017
970
1018
971
1019
972
--
···
1021
974
--
1022
975
1023
976
ALTER TABLE ONLY public.tile_type_consumes
1024
1024
-
ADD CONSTRAINT tile_type_consumes_resource_id_fkey FOREIGN KEY (
1025
1025
-
resource_id
1026
1026
-
) REFERENCES public.resources (id) ON UPDATE CASCADE ON DELETE RESTRICT;
977
977
+
ADD CONSTRAINT tile_type_consumes_resource_id_fkey FOREIGN KEY (resource_id) REFERENCES public.resources(id) ON UPDATE CASCADE ON DELETE RESTRICT;
1027
978
1028
979
1029
980
--
···
1031
982
--
1032
983
1033
984
ALTER TABLE ONLY public.tile_type_consumes
1034
1034
-
ADD CONSTRAINT tile_type_consumes_tile_type_id_fkey FOREIGN KEY (
1035
1035
-
tile_type_id
1036
1036
-
) REFERENCES public.tile_types (id) ON UPDATE CASCADE ON DELETE CASCADE;
985
985
+
ADD CONSTRAINT tile_type_consumes_tile_type_id_fkey FOREIGN KEY (tile_type_id) REFERENCES public.tile_types(id) ON UPDATE CASCADE ON DELETE CASCADE;
1037
986
1038
987
1039
988
--
···
1041
990
--
1042
991
1043
992
ALTER TABLE ONLY public.tile_type_produces
1044
1044
-
ADD CONSTRAINT tile_type_produces_resource_id_fkey FOREIGN KEY (
1045
1045
-
resource_id
1046
1046
-
) REFERENCES public.resources (id) ON UPDATE CASCADE ON DELETE RESTRICT;
993
993
+
ADD CONSTRAINT tile_type_produces_resource_id_fkey FOREIGN KEY (resource_id) REFERENCES public.resources(id) ON UPDATE CASCADE ON DELETE RESTRICT;
1047
994
1048
995
1049
996
--
···
1051
998
--
1052
999
1053
1000
ALTER TABLE ONLY public.tile_type_produces
1054
1054
-
ADD CONSTRAINT tile_type_produces_tile_type_id_fkey FOREIGN KEY (
1055
1055
-
tile_type_id
1056
1056
-
) REFERENCES public.tile_types (id) ON UPDATE CASCADE ON DELETE CASCADE;
1001
1001
+
ADD CONSTRAINT tile_type_produces_tile_type_id_fkey FOREIGN KEY (tile_type_id) REFERENCES public.tile_types(id) ON UPDATE CASCADE ON DELETE CASCADE;
1057
1002
1058
1003
1059
1004
--
···
1061
1006
--
1062
1007
1063
1008
ALTER TABLE ONLY public.tile_types
1064
1064
-
ADD CONSTRAINT tile_types_id_class_fkey FOREIGN KEY (
1065
1065
-
id, class
1066
1066
-
) REFERENCES public.card_types (id, class) ON UPDATE RESTRICT ON DELETE CASCADE;
1009
1009
+
ADD CONSTRAINT tile_types_id_class_fkey FOREIGN KEY (id, class) REFERENCES public.card_types(id, class) ON UPDATE RESTRICT ON DELETE CASCADE;
1067
1010
1068
1011
1069
1012
--
···
1071
1014
--
1072
1015
1073
1016
ALTER TABLE ONLY public.tile_types
1074
1074
-
ADD CONSTRAINT tile_types_id_fkey FOREIGN KEY (
1075
1075
-
id
1076
1076
-
) REFERENCES public.card_types (id) ON UPDATE CASCADE ON DELETE CASCADE;
1017
1017
+
ADD CONSTRAINT tile_types_id_fkey FOREIGN KEY (id) REFERENCES public.card_types(id) ON UPDATE CASCADE ON DELETE CASCADE;
1077
1018
1078
1019
1079
1020
--
···
1081
1022
--
1082
1023
1083
1024
ALTER TABLE ONLY public.tiles
1084
1084
-
ADD CONSTRAINT tiles_id_fkey FOREIGN KEY (id) REFERENCES public.cards (
1085
1085
-
id
1086
1086
-
) ON UPDATE CASCADE ON DELETE CASCADE;
1025
1025
+
ADD CONSTRAINT tiles_id_fkey FOREIGN KEY (id) REFERENCES public.cards(id) ON UPDATE CASCADE ON DELETE CASCADE;
1087
1026
1088
1027
1089
1028
--
···
1091
1030
--
1092
1031
1093
1032
ALTER TABLE ONLY public.tiles
1094
1094
-
ADD CONSTRAINT tiles_id_tile_type_id_fkey FOREIGN KEY (
1095
1095
-
id, tile_type_id
1096
1096
-
) REFERENCES public.cards (
1097
1097
-
id, card_type_id
1098
1098
-
) ON UPDATE CASCADE ON DELETE CASCADE;
1033
1033
+
ADD CONSTRAINT tiles_id_tile_type_id_fkey FOREIGN KEY (id, tile_type_id) REFERENCES public.cards(id, card_type_id) ON UPDATE CASCADE ON DELETE CASCADE;
1099
1034
1100
1035
1101
1036
--
···
1103
1038
--
1104
1039
1105
1040
ALTER TABLE ONLY public.tiles
1106
1106
-
ADD CONSTRAINT tiles_tile_type_id_fkey FOREIGN KEY (
1107
1107
-
tile_type_id
1108
1108
-
) REFERENCES public.tile_types (id) ON UPDATE CASCADE ON DELETE RESTRICT;
1041
1041
+
ADD CONSTRAINT tiles_tile_type_id_fkey FOREIGN KEY (tile_type_id) REFERENCES public.tile_types(id) ON UPDATE CASCADE ON DELETE RESTRICT;
1109
1042
1110
1043
1111
1044
--
···
1113
1046
--
1114
1047
1115
1048
\unrestrict aa4b4bc410c5cacbd97fc326d0f62806
1049
1049
+
+1
-1
packages/cartography/fixtures/seed.sql
···
47
47
VALUES
48
48
('default', '2026-01-01T00:00:00Z', '2026-01-01T00:00:00Z'),
49
49
('base-standard', '2026-01-01T00:00:00Z', NULL),
50
50
-
('halloween-2026', '2026-10-01T00:00:00Z', '2026-10-31T23:59:59Z')
50
50
+
('upcoming-holiday', now() + '30 days'::interval, now() + '37 days'::interval)
51
51
ON CONFLICT (id) DO UPDATE
52
52
SET start_date = excluded.start_date,
53
53
end_date = excluded.end_date;
+6
-5
packages/cartography/src/api/errors/mod.rs
···
36
36
}
37
37
38
38
#[derive(utoipa::ToSchema)]
39
39
-
#[expect(
39
39
+
#[cfg_attr(test, derive(serde::Deserialize))]
40
40
+
#[allow(
40
41
dead_code,
41
41
-
reason = "this is a stub type used for OpenAPI schema generation only"
42
42
+
reason = "this is a stub type used for OpenAPI schema generation and tests"
42
43
)]
43
44
pub struct ErrorDetailResponse {
44
44
-
code: &'static str,
45
45
-
message: String,
46
46
-
detail: Value,
45
45
+
pub code: String,
46
46
+
pub message: String,
47
47
+
pub detail: Value,
47
48
}
48
49
49
50
impl<T: ApiError> IntoResponse for JsonError<T> {
+89
packages/cartography/src/api/operations/get_banner.rs
···
6
6
use axum::extract::Path;
7
7
8
8
#[derive(serde::Serialize, utoipa::ToSchema)]
9
9
+
#[cfg_attr(test, derive(serde::Deserialize))]
9
10
pub struct GetBannerResponse {
10
11
banner: PackBanner,
11
12
banner_cards: Vec<PackBannerCard>,
···
74
75
banner_cards: row.distribution.unwrap().0,
75
76
}))
76
77
}
78
78
+
79
79
+
#[cfg(test)]
80
80
+
mod tests {
81
81
+
use crate::api::errors::{ApiError, BannerNotFoundError, ErrorDetailResponse};
82
82
+
use crate::test::prelude::*;
83
83
+
use axum::http::Request;
84
84
+
use axum::{body::Body, http::StatusCode};
85
85
+
use sqlx::PgPool;
86
86
+
use time::{Date, Month, OffsetDateTime, Time};
87
87
+
88
88
+
use super::GetBannerResponse;
89
89
+
90
90
+
#[sqlx::test(
91
91
+
migrator = "MIGRATOR",
92
92
+
fixtures(path = "../../../fixtures", scripts("seed"))
93
93
+
)]
94
94
+
async fn get_banner_ok(pool: PgPool) {
95
95
+
let app = crate::app::Config::test(pool).into_router();
96
96
+
97
97
+
let request = Request::get("/api/v1/banners/base-standard")
98
98
+
.body(Body::empty())
99
99
+
.unwrap();
100
100
+
101
101
+
let Ok(response) = app.oneshot(request).await;
102
102
+
assert_success!(response);
103
103
+
104
104
+
let response: GetBannerResponse = response.json().await.unwrap();
105
105
+
assert_eq!(response.banner.id, "base-standard");
106
106
+
assert_eq!(
107
107
+
response.banner.start_date,
108
108
+
OffsetDateTime::new_utc(
109
109
+
Date::from_calendar_date(2026, Month::January, 1).unwrap(),
110
110
+
Time::MIDNIGHT,
111
111
+
)
112
112
+
);
113
113
+
assert_eq!(response.banner.end_date, None);
114
114
+
assert_eq!(response.banner_cards.len(), 14);
115
115
+
}
116
116
+
117
117
+
#[sqlx::test(
118
118
+
migrator = "MIGRATOR",
119
119
+
fixtures(path = "../../../fixtures", scripts("seed"))
120
120
+
)]
121
121
+
async fn get_banner_done(pool: PgPool) {
122
122
+
let app = crate::app::Config::test(pool).into_router();
123
123
+
124
124
+
let request = Request::get("/api/v1/banners/default").empty().unwrap();
125
125
+
126
126
+
let Ok(response) = app.oneshot(request).await;
127
127
+
assert_success!(response);
128
128
+
129
129
+
let response: GetBannerResponse = response.json().await.unwrap();
130
130
+
assert_eq!(response.banner.id, "default");
131
131
+
assert!(response.banner_cards.is_empty());
132
132
+
}
133
133
+
134
134
+
#[sqlx::test(
135
135
+
migrator = "MIGRATOR",
136
136
+
fixtures(path = "../../../fixtures", scripts("seed"))
137
137
+
)]
138
138
+
async fn get_banner_upcoming(pool: PgPool) {
139
139
+
let app = crate::app::Config::test(pool).into_router();
140
140
+
141
141
+
let request = Request::get("/api/v1/banners/upcoming-holiday")
142
142
+
.empty()
143
143
+
.unwrap();
144
144
+
145
145
+
let Ok(response) = app.oneshot(request).await;
146
146
+
assert_success!(response);
147
147
+
148
148
+
let response: GetBannerResponse = response.json().await.unwrap();
149
149
+
assert_eq!(response.banner.id, "upcoming-holiday");
150
150
+
assert!(response.banner_cards.is_empty());
151
151
+
}
152
152
+
153
153
+
#[sqlx::test(migrator = "MIGRATOR")]
154
154
+
async fn get_banner_not_found(pool: PgPool) {
155
155
+
let app = crate::app::Config::test(pool).into_router();
156
156
+
157
157
+
let request = Request::get("/api/v1/banners/fake-banner").empty().unwrap();
158
158
+
159
159
+
let Ok(response) = app.oneshot(request).await;
160
160
+
assert_eq!(response.status(), StatusCode::NOT_FOUND);
161
161
+
162
162
+
let response: ErrorDetailResponse = response.json().await.unwrap();
163
163
+
assert_eq!(response.code, BannerNotFoundError::CODE);
164
164
+
}
165
165
+
}
+114
packages/cartography/src/api/operations/list_banners.rs
···
3
3
use axum::Json;
4
4
5
5
#[derive(serde::Serialize, utoipa::ToSchema)]
6
6
+
#[cfg_attr(test, derive(serde::Deserialize))]
6
7
pub struct ListBannersResponse {
7
8
banners: Vec<PackBanner>,
8
9
}
···
12
13
}
13
14
14
15
#[derive(serde::Deserialize, utoipa::ToSchema)]
16
16
+
#[cfg_attr(test, derive(serde::Serialize))]
15
17
#[schema(default)]
16
18
pub struct ListBannersRequest {
17
19
#[serde(default = "default_active")]
···
82
84
83
85
Ok(Json(ListBannersResponse { banners }))
84
86
}
87
87
+
88
88
+
#[cfg(test)]
89
89
+
mod tests {
90
90
+
use crate::test::prelude::*;
91
91
+
use axum::body::Body;
92
92
+
use axum::http::Request;
93
93
+
use sqlx::PgPool;
94
94
+
95
95
+
use super::{ListBannersRequest, ListBannersResponse, Status};
96
96
+
97
97
+
#[sqlx::test(
98
98
+
migrator = "MIGRATOR",
99
99
+
fixtures(path = "../../../fixtures", scripts("seed"))
100
100
+
)]
101
101
+
async fn list_banners_default_active(pool: PgPool) {
102
102
+
let app = crate::app::Config::test(pool).into_router();
103
103
+
104
104
+
let request = Request::post("/api/v1/banners")
105
105
+
.body(Body::empty())
106
106
+
.unwrap();
107
107
+
108
108
+
let Ok(response) = app.oneshot(request).await;
109
109
+
assert_success!(response);
110
110
+
111
111
+
let response: ListBannersResponse = response.json().await.unwrap();
112
112
+
assert_eq!(response.banners.len(), 1);
113
113
+
assert_eq!(response.banners[0].id, "base-standard");
114
114
+
}
115
115
+
116
116
+
#[sqlx::test(
117
117
+
migrator = "MIGRATOR",
118
118
+
fixtures(path = "../../../fixtures", scripts("seed"))
119
119
+
)]
120
120
+
async fn list_banners_all(pool: PgPool) {
121
121
+
let app = crate::app::Config::test(pool).into_router();
122
122
+
123
123
+
let request = Request::post("/api/v1/banners")
124
124
+
.json(ListBannersRequest {
125
125
+
status: vec![Status::Done, Status::Active, Status::Upcoming],
126
126
+
})
127
127
+
.unwrap();
128
128
+
129
129
+
let Ok(response) = app.oneshot(request).await;
130
130
+
assert_success!(response);
131
131
+
132
132
+
let response: ListBannersResponse = response.json().await.unwrap();
133
133
+
assert_eq!(response.banners.len(), 3);
134
134
+
assert_eq!(response.banners[0].id, "default");
135
135
+
assert_eq!(response.banners[1].id, "base-standard");
136
136
+
assert_eq!(response.banners[2].id, "upcoming-holiday");
137
137
+
}
138
138
+
139
139
+
#[sqlx::test(
140
140
+
migrator = "MIGRATOR",
141
141
+
fixtures(path = "../../../fixtures", scripts("seed"))
142
142
+
)]
143
143
+
async fn list_banners_done(pool: PgPool) {
144
144
+
let app = crate::app::Config::test(pool).into_router();
145
145
+
146
146
+
let request = Request::post("/api/v1/banners")
147
147
+
.json(ListBannersRequest {
148
148
+
status: vec![Status::Done],
149
149
+
})
150
150
+
.unwrap();
151
151
+
152
152
+
let Ok(response) = app.oneshot(request).await;
153
153
+
assert_success!(response);
154
154
+
155
155
+
let response: ListBannersResponse = response.json().await.unwrap();
156
156
+
assert_eq!(response.banners.len(), 1);
157
157
+
assert_eq!(response.banners[0].id, "default");
158
158
+
}
159
159
+
160
160
+
#[sqlx::test(
161
161
+
migrator = "MIGRATOR",
162
162
+
fixtures(path = "../../../fixtures", scripts("seed"))
163
163
+
)]
164
164
+
async fn list_banners_upcoming(pool: PgPool) {
165
165
+
let app = crate::app::Config::test(pool).into_router();
166
166
+
167
167
+
let request = Request::post("/api/v1/banners")
168
168
+
.json(ListBannersRequest {
169
169
+
status: vec![Status::Upcoming],
170
170
+
})
171
171
+
.unwrap();
172
172
+
173
173
+
let Ok(response) = app.oneshot(request).await;
174
174
+
assert_success!(response);
175
175
+
176
176
+
let response: ListBannersResponse = response.json().await.unwrap();
177
177
+
assert_eq!(response.banners.len(), 1);
178
178
+
assert_eq!(response.banners[0].id, "upcoming-holiday");
179
179
+
}
180
180
+
181
181
+
#[sqlx::test(
182
182
+
migrator = "MIGRATOR",
183
183
+
fixtures(path = "../../../fixtures", scripts("seed"))
184
184
+
)]
185
185
+
async fn list_banners_none(pool: PgPool) {
186
186
+
let app = crate::app::Config::test(pool).into_router();
187
187
+
188
188
+
let request = Request::post("/api/v1/banners")
189
189
+
.json(ListBannersRequest { status: vec![] })
190
190
+
.unwrap();
191
191
+
192
192
+
let Ok(response) = app.oneshot(request).await;
193
193
+
assert_success!(response);
194
194
+
195
195
+
let response: ListBannersResponse = response.json().await.unwrap();
196
196
+
assert!(response.banners.is_empty());
197
197
+
}
198
198
+
}
+29
packages/cartography/src/api/operations/list_card_types.rs
···
3
3
use axum::Json;
4
4
5
5
#[derive(serde::Serialize, utoipa::ToSchema)]
6
6
+
#[cfg_attr(test, derive(serde::Deserialize))]
6
7
pub struct ListCardTypesResponse {
7
8
card_types: Vec<CardType>,
8
9
}
···
57
58
.collect();
58
59
Ok(Json(ListCardTypesResponse { card_types }))
59
60
}
61
61
+
62
62
+
#[cfg(test)]
63
63
+
mod tests {
64
64
+
use crate::test::prelude::*;
65
65
+
use axum::body::Body;
66
66
+
use axum::http::Request;
67
67
+
use sqlx::PgPool;
68
68
+
69
69
+
use super::ListCardTypesResponse;
70
70
+
71
71
+
#[sqlx::test(
72
72
+
migrator = "MIGRATOR",
73
73
+
fixtures(path = "../../../fixtures", scripts("seed"))
74
74
+
)]
75
75
+
async fn get_banner_ok(pool: PgPool) {
76
76
+
let app = crate::app::Config::test(pool).into_router();
77
77
+
78
78
+
let request = Request::get("/api/v1/cardtypes")
79
79
+
.body(Body::empty())
80
80
+
.unwrap();
81
81
+
82
82
+
let Ok(response) = app.oneshot(request).await;
83
83
+
assert_success!(response);
84
84
+
85
85
+
let response: ListCardTypesResponse = response.json().await.unwrap();
86
86
+
assert_eq!(response.card_types.len(), 14);
87
87
+
}
88
88
+
}
+6
-7
packages/cartography/src/api/operations/pull_banner.rs
···
186
186
#[cfg(test)]
187
187
mod tests {
188
188
use crate::test::prelude::*;
189
189
-
use axum::body::Body;
190
189
use axum::http::{Request, StatusCode};
191
190
use sqlx::PgPool;
192
191
···
201
200
202
201
let request = Request::post("/api/v1/banners/base-standard/pull")
203
202
.header("Authorization", "Trust foxfriends")
204
204
-
.body(Body::empty())
203
203
+
.empty()
205
204
.unwrap();
206
205
207
206
let Ok(response) = app.oneshot(request).await;
···
223
222
224
223
let request = Request::post("/api/v1/banners/fake-banner/pull")
225
224
.header("Authorization", "Trust foxfriends")
226
226
-
.body(Body::empty())
225
225
+
.empty()
227
226
.unwrap();
228
227
229
228
let Ok(response) = app.oneshot(request).await;
···
239
238
240
239
let request = Request::post("/api/v1/banners/future-banner/pull")
241
240
.header("Authorization", "Trust foxfriends")
242
242
-
.body(Body::empty())
241
241
+
.empty()
243
242
.unwrap();
244
243
245
244
let Ok(response) = app.oneshot(request).await;
···
255
254
256
255
let request = Request::post("/api/v1/banners/past-banner/pull")
257
256
.header("Authorization", "Trust foxfriends")
258
258
-
.body(Body::empty())
257
257
+
.empty()
259
258
.unwrap();
260
259
261
260
let Ok(response) = app.oneshot(request).await;
···
271
270
272
271
let request = Request::post("/api/v1/banners/empty-banner/pull")
273
272
.header("Authorization", "Trust foxfriends")
274
274
-
.body(Body::empty())
273
273
+
.empty()
275
274
.unwrap();
276
275
277
276
let Ok(response) = app.oneshot(request).await;
···
286
285
let app = crate::app::Config::test(pool).into_router();
287
286
288
287
let request = Request::post("/api/v1/banners/base-standard/pull")
289
289
-
.body(Body::empty())
288
288
+
.empty()
290
289
.unwrap();
291
290
292
291
let Ok(response) = app.oneshot(request).await;
+19
-1
packages/cartography/src/test.rs
···
1
1
+
use axum::{body::Body, http::Request};
1
2
use http_body_util::BodyExt;
2
3
3
4
pub trait ResponseExt {
···
19
20
}
20
21
}
21
22
23
23
+
pub trait RequestExt {
24
24
+
fn empty(self) -> axum::http::Result<Request<Body>>;
25
25
+
fn json<T: serde::Serialize>(self, body: T) -> axum::http::Result<Request<Body>>;
26
26
+
}
27
27
+
28
28
+
impl RequestExt for axum::http::request::Builder {
29
29
+
fn empty(self) -> axum::http::Result<Request<Body>> {
30
30
+
self.body(Body::empty())
31
31
+
}
32
32
+
33
33
+
fn json<T: serde::Serialize>(self, body: T) -> axum::http::Result<Request<Body>> {
34
34
+
let body = serde_json::to_string(&body).unwrap();
35
35
+
self.header("Content-Type", "application/json")
36
36
+
.body(Body::from(body))
37
37
+
}
38
38
+
}
39
39
+
22
40
macro_rules! assert_success {
23
41
($response:expr) => {
24
42
assert!(
···
35
53
pub(crate) use assert_success;
36
54
37
55
pub mod prelude {
38
38
-
pub use super::ResponseExt as _;
56
56
+
pub use super::{RequestExt as _, ResponseExt as _};
39
57
pub use tower::ServiceExt as _;
40
58
41
59
pub const MIGRATOR: sqlx::migrate::Migrator =