Skip to content

Commit a8bca42

Browse files
authored
fix: PostObjectInterface schemaObject cache (#1397)
1 parent e054894 commit a8bca42

2 files changed

Lines changed: 31 additions & 8 deletions

File tree

library/PostObject/Decorators/PostObjectWithSchemaObject.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,15 @@ public function getSchemaProperty(string $property): mixed
4242
*/
4343
private function getSchemaObject(): BaseType
4444
{
45-
static $schemaObject = null;
45+
static $schemaObjectCache = [];
46+
$cacheKey = $this->postObject->getId();
4647

47-
if ($schemaObject === null) {
48-
$schemaObject = $this->schemaObjectFromPost->create($this->postObject);
49-
$this->postObject->schemaObject = $schemaObject;
48+
if (!isset($schemaObjectCache[$cacheKey])) {
49+
$schemaObjectCache[$cacheKey] = $this->schemaObjectFromPost->create($this->postObject);
50+
$this->postObject->schemaObject = $schemaObjectCache[$cacheKey]; // TODO: remove when all usage of ->schemaObject is removed from the codebase.
5051
}
5152

52-
return $schemaObject;
53+
return $schemaObjectCache[$cacheKey];
5354
}
5455

5556
/**

library/PostObject/Decorators/PostObjectWithSchemaObject.test.php

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,42 @@ public function testApplyMethodAppliesSchemaObjectToPost()
2929
$schemaObject = Schema::thing()->name('Foo');
3030
$schemaObjectFromPost = $this->getSchemaObjectFromPostInstance();
3131
$schemaObjectFromPost->method('create')->willReturn($schemaObject);
32+
$innerPostObject = $this->getPostObject();
33+
$innerPostObject->method('getId')->willReturn(123);
3234

33-
$postObject = new PostObjectWithSchemaObject($this->getPostObject(), $schemaObjectFromPost);
35+
$postObject = new PostObjectWithSchemaObject($innerPostObject, $schemaObjectFromPost);
3436

3537
$this->assertSame('Thing', $postObject->getSchemaProperty('@type'));
3638
$this->assertSame('Foo', $postObject->getSchemaProperty('name'));
3739
}
3840

41+
/**
42+
* @testdox caches schema object per post ID
43+
*/
44+
public function testCachesSchemaObjectPerPostId()
45+
{
46+
// Arrange
47+
$schemaObject = Schema::thing()->name('Foo');
48+
$schemaObjectFromPost = $this->getSchemaObjectFromPostInstance();
49+
$innerPostObject = $this->getPostObject();
50+
$innerPostObject->method('getId')->willReturn(321);
51+
$postObject = new PostObjectWithSchemaObject($this->getPostObject(), $schemaObjectFromPost);
52+
53+
// Assert
54+
$schemaObjectFromPost->expects($this->once())->method('create')->willReturn($schemaObject);
55+
56+
// Act
57+
$postObject->getSchemaProperty('@type');
58+
$postObject->getSchemaProperty('name');
59+
}
60+
3961
private function getSchemaObjectFromPostInstance(): SchemaObjectFromPostInterface|MockObject
4062
{
4163
return $this->createMock(SchemaObjectFromPostInterface::class);
4264
}
4365

44-
private function getPostObject(): PostObjectInterface
66+
private function getPostObject(): PostObjectInterface|MockObject
4567
{
46-
return new PostObject(1, new FakeWpService());
68+
return $this->createMock(PostObjectInterface::class);
4769
}
4870
}

0 commit comments

Comments
 (0)