Finish implementing SqliteGateway

This commit is contained in:
Lewis Dale 2023-03-09 13:05:43 +00:00
parent adeb7a1b51
commit f85c48b4a9
2 changed files with 87 additions and 16 deletions

View File

@ -33,14 +33,11 @@ class SqliteGateway extends WebmentionGatewayInterface {
public function get(int $id): ?Webmention public function get(int $id): ?Webmention
{ {
$sql = "SELECT * FROM webmentions;"; $sql = "SELECT * FROM webmentions WHERE id=:id LIMIT 1;";
$statement = $this->connection->query($sql); $statement = $this->connection->prepare($sql);
$statement->execute(["id" => $id]);
if ($statement == false) {
return null;
}
$row = $statement->fetch(PDO::FETCH_ASSOC); $row = $statement->fetch(PDO::FETCH_ASSOC);
$statement->closeCursor();
if ($row) { if ($row) {
return new Webmention( return new Webmention(
@ -57,7 +54,24 @@ class SqliteGateway extends WebmentionGatewayInterface {
public function getByPost(string $post): array public function getByPost(string $post): array
{ {
return []; $sql = "SELECT * FROM webmentions WHERE target=:post";
$statement = $this->connection->prepare($sql);
$statement->execute(["post" => $post]);
$mentions = [];
while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
$mentions[] = new Webmention(
$row["id"],
$row["target"],
$row["source"],
$row["content"],
$row["author"]
);
}
$statement->closeCursor();
return $mentions;
} }
public function save(Webmention $webmention): ?int public function save(Webmention $webmention): ?int
@ -78,8 +92,10 @@ class SqliteGateway extends WebmentionGatewayInterface {
public function delete(Webmention $webmention): void public function delete(Webmention $webmention): void
{ {
throw new Exception("Method " . SqliteGateway::class . "::delete not implemented"); $sql = "DELETE FROM webmentions WHERE id=:id;";
$statement = $this->connection->prepare($sql);
$statement->execute(["id" => $webmention->id]);
$statement->closeCursor();
} }
} }
?> ?>

View File

@ -10,9 +10,15 @@ use PHPUnit\Framework\TestCase;
class SqliteGatewayTest extends TestCase class SqliteGatewayTest extends TestCase
{ {
private SqliteGateway $gateway;
protected function setUp(): void
{
$this->gateway = new SqliteGateway(":memory:");
}
public function testCanInsertAWebmention() public function testCanInsertAWebmention()
{ {
$gateway = new SqliteGateway(":memory:");
$webmention = new Webmention( $webmention = new Webmention(
null, null,
@ -22,13 +28,13 @@ class SqliteGatewayTest extends TestCase
"Some Author Name" "Some Author Name"
); );
$webmention->id = $gateway->save($webmention); $webmention->id = $this->gateway->save($webmention);
$this->assertNotNull($webmention->id); $this->assertNotNull($webmention->id);
} }
public function testCanRetrieveAWebmention() public function testCanRetrieveAWebmention()
{ {
$gateway = new SqliteGateway(":memory:"); $this->gateway = new SqliteGateway(":memory:");
$webmention = new Webmention( $webmention = new Webmention(
null, null,
@ -38,10 +44,59 @@ class SqliteGatewayTest extends TestCase
"Some Author Name" "Some Author Name"
); );
$webmention->id = $gateway->save($webmention); $webmention->id = $this->gateway->save($webmention);
$retrieved = $gateway->get($webmention->id); $retrieved = $this->gateway->get($webmention->id);
$this->assertEquals($webmention, $retrieved, ((string) $webmention). " " . ((string) $retrieved)); $this->assertEquals($webmention, $retrieved);
}
public function testCanDeleteAWebmention()
{
$this->gateway = new SqliteGateway(":memory:");
$webmention = new Webmention(
null,
"https://lewisdale.dev/post/a-post",
"https://a-source.url",
"No content",
"Some Author Name"
);
$webmention->id = $this->gateway->save($webmention);
$this->gateway->delete($webmention);
$retrieved = $this->gateway->get($webmention->id);
$this->assertNull($retrieved);
}
public function testCanGetByPost()
{
$this->gateway = new SqliteGateway(":memory:");
foreach(range(0, 4) as $_) {
$this->gateway->save(new Webmention(
null,
"https://lewisdale.dev/post/a-new-post",
"https://a-source.url",
"No content",
"Some Author Name"
));
}
foreach(range(0, 4) as $_) {
$this->gateway->save(new Webmention(
null,
"https://lewisdale.dev/post/a-different-post",
"https://a-source.url",
"No content",
"Some Author Name"
));
}
$mentions = $this->gateway->getByPost("https://lewisdale.dev/post/a-new-post");
$this->assertCount(5, $mentions);
} }
} }