@@ -532,17 +532,176 @@ public void Sets_Attribute_Values_On_Included_HasOne_Relationships()
532
532
Assert . Equal ( expectedName , result . Independent . Name ) ;
533
533
}
534
534
535
+
536
+ [ Fact ]
537
+ public void Can_Deserialize_Nested_Included_HasMany_Relationships ( )
538
+ {
539
+ // arrange
540
+ var contextGraphBuilder = new ContextGraphBuilder ( ) ;
541
+ contextGraphBuilder . AddResource < OneToManyIndependent > ( "independents" ) ;
542
+ contextGraphBuilder . AddResource < OneToManyDependent > ( "dependents" ) ;
543
+ contextGraphBuilder . AddResource < ManyToManyNested > ( "many-to-manys" ) ;
544
+
545
+ var deserializer = GetDeserializer ( contextGraphBuilder ) ;
546
+
547
+ var contentString =
548
+ @"{
549
+ ""data"": {
550
+ ""type"": ""independents"",
551
+ ""id"": ""1"",
552
+ ""attributes"": { },
553
+ ""relationships"": {
554
+ ""many-to-manys"": {
555
+ ""data"": [{
556
+ ""type"": ""many-to-manys"",
557
+ ""id"": ""2""
558
+ }, {
559
+ ""type"": ""many-to-manys"",
560
+ ""id"": ""3""
561
+ }]
562
+ }
563
+ }
564
+ },
565
+ ""included"": [
566
+ {
567
+ ""type"": ""many-to-manys"",
568
+ ""id"": ""2"",
569
+ ""attributes"": {},
570
+ ""relationships"": {
571
+ ""dependent"": {
572
+ ""data"": {
573
+ ""type"": ""dependents"",
574
+ ""id"": ""4""
575
+ }
576
+ },
577
+ ""independent"": {
578
+ ""data"": {
579
+ ""type"": ""independents"",
580
+ ""id"": ""5""
581
+ }
582
+ }
583
+ }
584
+ },
585
+ {
586
+ ""type"": ""many-to-manys"",
587
+ ""id"": ""3"",
588
+ ""attributes"": {},
589
+ ""relationships"": {
590
+ ""dependent"": {
591
+ ""data"": {
592
+ ""type"": ""dependents"",
593
+ ""id"": ""4""
594
+ }
595
+ },
596
+ ""independent"": {
597
+ ""data"": {
598
+ ""type"": ""independents"",
599
+ ""id"": ""6""
600
+ }
601
+ }
602
+ }
603
+ },
604
+ {
605
+ ""type"": ""dependents"",
606
+ ""id"": ""4"",
607
+ ""attributes"": {},
608
+ ""relationships"": {
609
+ ""many-to-manys"": {
610
+ ""data"": [{
611
+ ""type"": ""many-to-manys"",
612
+ ""id"": ""2""
613
+ }, {
614
+ ""type"": ""many-to-manys"",
615
+ ""id"": ""3""
616
+ }]
617
+ }
618
+ }
619
+ }
620
+ ,
621
+ {
622
+ ""type"": ""independents"",
623
+ ""id"": ""5"",
624
+ ""attributes"": {},
625
+ ""relationships"": {
626
+ ""many-to-manys"": {
627
+ ""data"": [{
628
+ ""type"": ""many-to-manys"",
629
+ ""id"": ""2""
630
+ }]
631
+ }
632
+ }
633
+ }
634
+ ,
635
+ {
636
+ ""type"": ""independents"",
637
+ ""id"": ""6"",
638
+ ""attributes"": {},
639
+ ""relationships"": {
640
+ ""many-to-manys"": {
641
+ ""data"": [{
642
+ ""type"": ""many-to-manys"",
643
+ ""id"": ""3""
644
+ }]
645
+ }
646
+ }
647
+ }
648
+ ]
649
+ }" ;
650
+
651
+ // act
652
+ var result = deserializer . Deserialize < OneToManyDependent > ( contentString ) ;
653
+
654
+ // assert
655
+ Assert . NotNull ( result ) ;
656
+ Assert . Equal ( 1 , result . Id ) ;
657
+ Assert . NotNull ( result . ManyToManys ) ;
658
+ Assert . Equal ( 2 , result . ManyToManys . Count ) ;
659
+ }
660
+
661
+ private JsonApiDeSerializer GetDeserializer ( ContextGraphBuilder contextGraphBuilder )
662
+ {
663
+ var contextGraph = contextGraphBuilder . Build ( ) ;
664
+
665
+ var jsonApiContextMock = new Mock < IJsonApiContext > ( ) ;
666
+ jsonApiContextMock . SetupAllProperties ( ) ;
667
+ jsonApiContextMock . Setup ( m => m . ContextGraph ) . Returns ( contextGraph ) ;
668
+ jsonApiContextMock . Setup ( m => m . AttributesToUpdate ) . Returns ( new Dictionary < AttrAttribute , object > ( ) ) ;
669
+ jsonApiContextMock . Setup ( m => m . RelationshipsToUpdate ) . Returns ( new Dictionary < RelationshipAttribute , object > ( ) ) ;
670
+ jsonApiContextMock . Setup ( m => m . HasManyRelationshipPointers ) . Returns ( new HasManyRelationshipPointers ( ) ) ;
671
+ jsonApiContextMock . Setup ( m => m . HasOneRelationshipPointers ) . Returns ( new HasOneRelationshipPointers ( ) ) ;
672
+
673
+ var jsonApiOptions = new JsonApiOptions ( ) ;
674
+ jsonApiContextMock . Setup ( m => m . Options ) . Returns ( jsonApiOptions ) ;
675
+
676
+ var deserializer = new JsonApiDeSerializer ( jsonApiContextMock . Object ) ;
677
+
678
+ return deserializer ;
679
+ }
680
+
681
+ private class ManyToManyNested : Identifiable
682
+ {
683
+ [ Attr ( "name" ) ] public string Name { get ; set ; }
684
+ [ HasOne ( "dependent" ) ] public OneToManyDependent Dependents { get ; set ; }
685
+ public int DependentId { get ; set ; }
686
+ [ HasOne ( "independent" ) ] public OneToManyIndependent Independents { get ; set ; }
687
+ public int InependentId { get ; set ; }
688
+ }
689
+
535
690
private class OneToManyDependent : Identifiable
536
691
{
537
692
[ Attr ( "name" ) ] public string Name { get ; set ; }
538
693
[ HasOne ( "independent" ) ] public OneToManyIndependent Independent { get ; set ; }
539
694
public int IndependentId { get ; set ; }
695
+
696
+ [ HasMany ( "many-to-manys" ) ] public List < ManyToManyNested > ManyToManys { get ; set ; }
540
697
}
541
698
542
699
private class OneToManyIndependent : Identifiable
543
700
{
544
701
[ Attr ( "name" ) ] public string Name { get ; set ; }
545
702
[ HasMany ( "dependents" ) ] public List < OneToManyDependent > Dependents { get ; set ; }
703
+
704
+ [ HasMany ( "many-to-manys" ) ] public List < ManyToManyNested > ManyToManys { get ; set ; }
546
705
}
547
706
}
548
707
}
0 commit comments