@@ -923,6 +923,73 @@ def configure(binder: Binder) -> None:
923923 assert injector .get (PluginA ) is not injector .get (PluginA )
924924
925925
926+ def test_multibinds_are_extended_by_child_injectors () -> None :
927+ parent_injector = Injector ()
928+ parent_injector .binder .multibind (List [str ], to = ['parent name' ])
929+
930+ child_injector = parent_injector .create_child_injector ()
931+ child_injector .binder .multibind (List [str ], to = ['child name' ])
932+
933+ assert parent_injector .get (List [str ]) == ['parent name' ]
934+ assert child_injector .get (List [str ]) == ['parent name' , 'child name' ]
935+
936+
937+ def test_multibind_dict_is_extended_by_child_injectors () -> None :
938+ parent_injector = Injector ()
939+ parent_injector .binder .multibind (Dict [str , str ], to = {'parent' : 'p' , 'shared' : 'from_parent' })
940+
941+ child_injector = parent_injector .create_child_injector ()
942+ child_injector .binder .multibind (Dict [str , str ], to = {'child' : 'c' , 'shared' : 'from_child' })
943+
944+ assert parent_injector .get (Dict [str , str ]) == {'parent' : 'p' , 'shared' : 'from_parent' }
945+ assert child_injector .get (Dict [str , str ]) == {'parent' : 'p' , 'shared' : 'from_child' , 'child' : 'c' }
946+
947+
948+ def test_multibind_multi_level_hierarchy_extended_by_child_injectors () -> None :
949+ parent = Injector ()
950+ parent .binder .multibind (List [str ], to = ['parent' ])
951+
952+ child = parent .create_child_injector ()
953+ child .binder .multibind (List [str ], to = ['child' ])
954+
955+ grandchild = child .create_child_injector ()
956+ grandchild .binder .multibind (List [str ], to = ['grandchild' ])
957+
958+ assert parent .get (List [str ]) == ['parent' ]
959+ assert child .get (List [str ]) == ['parent' , 'child' ]
960+ assert grandchild .get (List [str ]) == ['parent' , 'child' , 'grandchild' ]
961+
962+
963+ def test_multibind_skipped_level_child_injector () -> None :
964+ parent = Injector ()
965+ parent .binder .multibind (List [str ], to = ['parent' ])
966+
967+ child = parent .create_child_injector ()
968+
969+ grandchild = child .create_child_injector ()
970+ grandchild .binder .multibind (List [str ], to = ['grandchild' ])
971+
972+ assert parent .get (List [str ]) == ['parent' ]
973+ assert child .get (List [str ]) == ['parent' ]
974+ assert grandchild .get (List [str ]) == ['parent' , 'grandchild' ]
975+
976+
977+ def test_multibind_child_only_when_parent_has_no_binding () -> None :
978+ parent = Injector ()
979+ child = parent .create_child_injector ()
980+ child .binder .multibind (List [str ], to = ['only_child' ])
981+ assert child .get (List [str ]) == ['only_child' ]
982+
983+
984+ def test_multibind_child_when_parent_has_non_multibinder_binding () -> None :
985+ parent = Injector ()
986+ parent .binder ._bindings [List [str ]] = parent .binder .create_binding (List [str ], ['not_a_multibinder' ])
987+ child = parent .create_child_injector ()
988+ child .binder .multibind (List [str ], to = ['child_multibind' ])
989+ assert child .get (List [str ]) == ['child_multibind' ]
990+
991+
992+
926993def test_regular_bind_and_provider_dont_work_with_multibind ():
927994 # We only want multibind and multiprovider to work to avoid confusion
928995
0 commit comments