@@ -108,4 +108,59 @@ public function testFetchManyToManyIdsExecutesQuery(): void
108108
109109 $ this ->assertSame ([10 , 11 ], $ result );
110110 }
111+
112+ public function testAuditCollectionDeleteInitializedWithoutDiffUsesJoinTableQuery (): void
113+ {
114+ $ listener = new AuditEventListener ();
115+ $ owner = new \stdClass ();
116+
117+ $ mapping = ManyToManyOwningSideMapping::fromMappingArrayAndNamingStrategy ([
118+ 'fieldName ' => 'tags ' ,
119+ 'sourceEntity ' => \stdClass::class,
120+ 'targetEntity ' => \stdClass::class,
121+ 'isOwningSide ' => true ,
122+ 'joinTable ' => [
123+ 'name ' => 'owner_tags ' ,
124+ 'joinColumns ' => [['name ' => 'owner_id ' , 'referencedColumnName ' => 'id ' ]],
125+ 'inverseJoinColumns ' => [['name ' => 'tag_id ' , 'referencedColumnName ' => 'id ' ]],
126+ ],
127+ ], new DefaultNamingStrategy ());
128+
129+ $ em = $ this ->createMock (EntityManagerInterface::class);
130+ $ meta = new ClassMetadata (\stdClass::class);
131+ $ collection = new PersistentCollection ($ em , $ meta , new ArrayCollection ());
132+ $ collection ->setOwner ($ owner , $ mapping );
133+ $ collection ->takeSnapshot ();
134+
135+ $ ownerMeta = $ this ->getMockBuilder (ClassMetadata::class)
136+ ->disableOriginalConstructor ()
137+ ->getMock ();
138+ $ ownerMeta ->method ('getIdentifierValues ' )->with ($ owner )->willReturn (['id ' => 123 ]);
139+
140+ $ conn = $ this ->getMockBuilder (Connection::class)
141+ ->disableOriginalConstructor ()
142+ ->getMock ();
143+ $ conn ->method ('fetchFirstColumn ' )->willReturn (['10 ' , '11 ' ]);
144+
145+ $ em ->method ('getConnection ' )->willReturn ($ conn );
146+ $ em ->method ('getClassMetadata ' )->with (get_class ($ owner ))->willReturn ($ ownerMeta );
147+
148+ $ emProp = new \ReflectionProperty (AuditEventListener::class, 'em ' );
149+ $ emProp ->setAccessible (true );
150+ $ emProp ->setValue ($ listener , $ em );
151+
152+ $ method = new \ReflectionMethod (AuditEventListener::class, 'auditCollection ' );
153+ $ method ->setAccessible (true );
154+
155+ [$ subject , $ payload , $ eventType ] = $ method ->invoke (
156+ $ listener ,
157+ $ collection ,
158+ new \stdClass (),
159+ IAuditStrategy::EVENT_COLLECTION_MANYTOMANY_DELETE
160+ );
161+
162+ $ this ->assertSame ($ owner , $ subject );
163+ $ this ->assertSame ([10 , 11 ], $ payload ['deleted_ids ' ]);
164+ $ this ->assertSame (IAuditStrategy::EVENT_COLLECTION_MANYTOMANY_DELETE , $ eventType );
165+ }
111166}
0 commit comments