summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Turner <jturner.usa@gmail.com>2025-09-26 02:24:00 -0400
committerJohn Turner <jturner.usa@gmail.com>2025-09-26 02:24:00 -0400
commit06ea9477b95caed298bc8cadac94fa98fc97e8d2 (patch)
treed1b98347d07466f8980a4cb9d35cd973c670231b
parent02f93142eedb1b56c9c93dcc699bd9d3cd57b88a (diff)
downloadpypaste-06ea9477b95caed298bc8cadac94fa98fc97e8d2.tar.gz
add tests for s3 storage backend
-rw-r--r--pypaste/server/s3/__init__.py3
-rw-r--r--pypaste/server/s3/bucket.py2
-rw-r--r--tests/meson.build2
-rwxr-xr-xtests/test_storage.py (renamed from tests/test_sqlite_storage.py)54
4 files changed, 46 insertions, 15 deletions
diff --git a/pypaste/server/s3/__init__.py b/pypaste/server/s3/__init__.py
index c9c8297..6a30358 100644
--- a/pypaste/server/s3/__init__.py
+++ b/pypaste/server/s3/__init__.py
@@ -53,6 +53,8 @@ class S3(Storage):
(key.data, key.length, paste.dt.isoformat(), len(compressed), paste.syntax),
)
+ await self.connection.execute("insert into s3 values(?)", (key.data,))
+
try:
await self.bucket.put(key.data.hex(), compressed)
await self.connection.commit()
@@ -81,6 +83,7 @@ class S3(Storage):
async def delete(self, key: Key) -> None:
await self.connection.execute("delete from pastes where key=?", (key.data,))
+ await self.connection.execute("delete from s3 where key=?", (key.data,))
try:
await self.bucket.delete(key.data.hex())
diff --git a/pypaste/server/s3/bucket.py b/pypaste/server/s3/bucket.py
index c795bbd..823d959 100644
--- a/pypaste/server/s3/bucket.py
+++ b/pypaste/server/s3/bucket.py
@@ -140,7 +140,7 @@ class Bucket:
url = f"https://{self.endpoint}/{self.bucket}/{key}"
async with aiohttp.ClientSession().delete(url, headers=headers) as delete:
- if delete.status != 200:
+ if delete.status != 204:
raise Exception(
f"failed to delete {self.endpoint}/{self.bucket}/{key} with {delete.status}"
)
diff --git a/tests/meson.build b/tests/meson.build
index c15bbab..6e66e76 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -1,4 +1,4 @@
-tests = files('test_client_zen.py', 'test_server.py', 'test_sqlite_storage.py')
+tests = files('test_client_zen.py', 'test_server.py', 'test_storage.py')
foreach test : tests
name = fs.stem(test)
diff --git a/tests/test_sqlite_storage.py b/tests/test_storage.py
index 6a93561..e5f312c 100755
--- a/tests/test_sqlite_storage.py
+++ b/tests/test_storage.py
@@ -1,15 +1,18 @@
#!/usr/bin/env python3
import sys
+import os
import asyncio
import tempfile
import aiosqlite
import string
import random
-from pypaste.server import Paste, Key, keygen
+from pypaste.server import Paste, Key, Storage, keygen
from pypaste.server.sqlite import Sqlite
+from pypaste.server.s3 import S3
from datetime import datetime
from pathlib import Path
+from typing import List
def truncate(path: Path) -> None:
@@ -23,7 +26,7 @@ def generate_key() -> str:
return "".join(random.choice(chars) for _ in range(10))
-async def test_exists_but_not_in_our_table(storage: Sqlite) -> None:
+async def test_exists_but_not_in_our_table(storage: Storage) -> None:
key = keygen(6)
await storage.connection.execute(
@@ -34,7 +37,7 @@ async def test_exists_but_not_in_our_table(storage: Sqlite) -> None:
assert not await storage.exists(key)
-async def test_exists(storage: Sqlite) -> None:
+async def test_exists(storage: Storage) -> None:
dt = datetime.now()
key = keygen(6)
@@ -45,7 +48,7 @@ async def test_exists(storage: Sqlite) -> None:
assert not await storage.exists(keygen(6))
-async def test_delete(storage: Sqlite) -> None:
+async def test_delete(storage: Storage) -> None:
dt = datetime.now()
key = keygen(6)
@@ -58,7 +61,7 @@ async def test_delete(storage: Sqlite) -> None:
assert not await storage.exists(key)
-async def test_insert_retrieve(storage: Sqlite) -> None:
+async def test_insert_retrieve(storage: Storage) -> None:
dt = datetime.now()
key = keygen(6)
@@ -73,6 +76,8 @@ async def test_insert_retrieve(storage: Sqlite) -> None:
async def main() -> int:
+ stores: List[Storage] = []
+
with tempfile.TemporaryDirectory() as tmpdir:
f = Path(tmpdir) / "database"
truncate(f)
@@ -89,14 +94,37 @@ async def main() -> int:
)
)
- storage = Sqlite(connection)
- await storage.setup()
-
- await asyncio.gather(
- test_insert_retrieve(storage),
- test_delete(storage),
- test_exists_but_not_in_our_table(storage),
- )
+ sqlite_storage = Sqlite(connection)
+ await sqlite_storage.setup()
+ stores.append(sqlite_storage)
+
+ try:
+ os.environ["PYPASTE_TEST_S3"]
+ test_s3 = True
+ except KeyError:
+ test_s3 = False
+
+ if test_s3:
+ s3_storage = S3(
+ connection,
+ os.environ["PYPASTE_TEST_ENDPOINT"],
+ os.environ["PYPASTE_TEST_REGION"],
+ os.environ["PYPASTE_TEST_BUCKET"],
+ os.environ["PYPASTE_TEST_ACCESS_KEY"],
+ os.environ["PYPASTE_TEST_SECRET_KEY"],
+ )
+ await s3_storage.setup()
+ stores.append(s3_storage)
+
+ for store in stores:
+ await asyncio.gather(
+ test_insert_retrieve(store),
+ test_insert_retrieve(store),
+ test_delete(store),
+ test_delete(store),
+ test_exists_but_not_in_our_table(store),
+ test_exists_but_not_in_our_table(store),
+ )
return 0