88use ChrisPenny \DataObjectToFixture \Tests \Mocks \Models \MockImage ;
99use ChrisPenny \DataObjectToFixture \Tests \Mocks \Models \MockTag ;
1010use ChrisPenny \DataObjectToFixture \Tests \Mocks \Models \MockThroughTarget ;
11+ use ChrisPenny \DataObjectToFixture \Tests \Mocks \Pages \MockNativePoly ;
1112use ChrisPenny \DataObjectToFixture \Tests \Mocks \Pages \MockPage ;
1213use ChrisPenny \DataObjectToFixture \Tests \Mocks \Pages \MockPageWithExclusions ;
1314use ChrisPenny \DataObjectToFixture \Tests \Mocks \Pages \MockPolymorphicPage ;
1415use ChrisPenny \DataObjectToFixture \Tests \Mocks \Relations \MockThroughObject ;
1516use Exception ;
16- use InvalidArgumentException ;
1717use SilverStripe \Dev \SapphireTest ;
1818use Symfony \Component \Yaml \Yaml ;
1919
@@ -35,6 +35,7 @@ class FixtureServiceTest extends SapphireTest
3535 MockThroughTarget::class,
3636 MockThroughObject::class,
3737 MockExcludedObject::class,
38+ MockNativePoly::class,
3839 ];
3940
4041 public function testAddDataObjectThrowsExceptionWhenNotInDb (): void
@@ -277,7 +278,7 @@ public function testPolymorphicHasOneWithFieldClassnameMap(): void
277278 $ this ->assertSame ($ expected , Yaml::parse ($ service ->outputFixture ()));
278279 }
279280
280- public function testPolymorphicHasOneWithoutClassnameThrowsException (): void
281+ public function testPolymorphicHasOneWithoutClassnameWarns (): void
281282 {
282283 $ image = MockImage::create ();
283284 $ image ->Name = 'no-map-image.jpg ' ;
@@ -286,16 +287,51 @@ public function testPolymorphicHasOneWithoutClassnameThrowsException(): void
286287 $ page = MockPolymorphicPage::create ();
287288 $ page ->Title = 'Unmapped Polymorphic ' ;
288289 $ page ->PolymorphicHasOneID = $ image ->ID ;
289- // Don't set PolymorphicHasOneClass — the map resolves to empty string
290+ // Don't set PolymorphicHasOneClass — the map resolves to empty/null
290291 $ page ->write ();
291292
292293 $ service = new FixtureService ();
294+ $ service ->addDataObject ($ page );
295+
296+ $ this ->assertSame (
297+ [sprintf (
298+ 'field_classname_map for "PolymorphicHasOneID" in "%s" did not resolve to a valid class name ' ,
299+ MockPolymorphicPage::class
300+ )],
301+ $ service ->getWarnings ()
302+ );
303+ }
293304
294- // When the field_classname_map resolves to an empty/invalid class name, Silverstripe throws
295- // an InvalidArgumentException from DataObject::get()
296- $ this ->expectException (InvalidArgumentException::class);
305+ public function testArrayFormatPolymorphicHasOne (): void
306+ {
307+ $ image = MockImage::create ();
308+ $ image ->Name = 'native-poly.jpg ' ;
309+ $ image ->write ();
297310
311+ $ page = MockNativePoly::create ();
312+ $ page ->Title = 'Native Polymorphic ' ;
313+ $ page ->OwnerID = $ image ->ID ;
314+ $ page ->OwnerClass = MockImage::class;
315+ $ page ->write ();
316+
317+ $ service = new FixtureService ();
298318 $ service ->addDataObject ($ page );
319+
320+ $ parsed = Yaml::parse ($ service ->outputFixture ());
321+
322+ $ expected = [
323+ MockImage::class => [
324+ $ image ->ID => ['Name ' => 'native-poly.jpg ' ],
325+ ],
326+ MockNativePoly::class => [
327+ $ page ->ID => [
328+ 'Title ' => 'Native Polymorphic ' ,
329+ 'Owner ' => sprintf ('=>%s.%s ' , MockImage::class, $ image ->ID ),
330+ ],
331+ ],
332+ ];
333+
334+ $ this ->assertSame ($ expected , $ parsed );
299335 }
300336
301337 public function testHasOneSkipsWhenNoValue (): void
0 commit comments