153 lines
5 KiB
Python
153 lines
5 KiB
Python
|
import pytest
|
||
|
from pydantic import BaseModel, ValidationError
|
||
|
|
||
|
from pydantic_extra_types.s3 import S3Path
|
||
|
|
||
|
|
||
|
class S3Check(BaseModel):
|
||
|
path: S3Path
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize(
|
||
|
'raw,bucket,key,last_key',
|
||
|
[
|
||
|
(
|
||
|
's3://my-data-bucket/2023/08/29/sales-report.csv',
|
||
|
'my-data-bucket',
|
||
|
'2023/08/29/sales-report.csv',
|
||
|
'sales-report.csv',
|
||
|
),
|
||
|
(
|
||
|
's3://logs-bucket/app-logs/production/2024/07/01/application-log.txt',
|
||
|
'logs-bucket',
|
||
|
'app-logs/production/2024/07/01/application-log.txt',
|
||
|
'application-log.txt',
|
||
|
),
|
||
|
(
|
||
|
's3://backup-storage/user_data/john_doe/photos/photo-2024-08-15.jpg',
|
||
|
'backup-storage',
|
||
|
'user_data/john_doe/photos/photo-2024-08-15.jpg',
|
||
|
'photo-2024-08-15.jpg',
|
||
|
),
|
||
|
(
|
||
|
's3://analytics-bucket/weekly-reports/Q3/2023/week-35-summary.pdf',
|
||
|
'analytics-bucket',
|
||
|
'weekly-reports/Q3/2023/week-35-summary.pdf',
|
||
|
'week-35-summary.pdf',
|
||
|
),
|
||
|
(
|
||
|
's3://project-data/docs/presentations/quarterly_review.pptx',
|
||
|
'project-data',
|
||
|
'docs/presentations/quarterly_review.pptx',
|
||
|
'quarterly_review.pptx',
|
||
|
),
|
||
|
(
|
||
|
's3://my-music-archive/genres/rock/2024/favorite-songs.mp3',
|
||
|
'my-music-archive',
|
||
|
'genres/rock/2024/favorite-songs.mp3',
|
||
|
'favorite-songs.mp3',
|
||
|
),
|
||
|
(
|
||
|
's3://video-uploads/movies/2024/03/action/thriller/movie-trailer.mp4',
|
||
|
'video-uploads',
|
||
|
'movies/2024/03/action/thriller/movie-trailer.mp4',
|
||
|
'movie-trailer.mp4',
|
||
|
),
|
||
|
(
|
||
|
's3://company-files/legal/contracts/contract-2023-09-01.pdf',
|
||
|
'company-files',
|
||
|
'legal/contracts/contract-2023-09-01.pdf',
|
||
|
'contract-2023-09-01.pdf',
|
||
|
),
|
||
|
(
|
||
|
's3://dev-environment/source-code/release_v1.0.2.zip',
|
||
|
'dev-environment',
|
||
|
'source-code/release_v1.0.2.zip',
|
||
|
'release_v1.0.2.zip',
|
||
|
),
|
||
|
(
|
||
|
's3://public-bucket/open-data/geojson/maps/city_boundaries.geojson',
|
||
|
'public-bucket',
|
||
|
'open-data/geojson/maps/city_boundaries.geojson',
|
||
|
'city_boundaries.geojson',
|
||
|
),
|
||
|
(
|
||
|
's3://image-storage/2024/portfolio/shoots/wedding/couple_photo_12.jpg',
|
||
|
'image-storage',
|
||
|
'2024/portfolio/shoots/wedding/couple_photo_12.jpg',
|
||
|
'couple_photo_12.jpg',
|
||
|
),
|
||
|
(
|
||
|
's3://finance-data/reports/2024/Q2/income_statement.xlsx',
|
||
|
'finance-data',
|
||
|
'reports/2024/Q2/income_statement.xlsx',
|
||
|
'income_statement.xlsx',
|
||
|
),
|
||
|
(
|
||
|
's3://training-data/nlp/corpora/english/2023/text_corpus.txt',
|
||
|
'training-data',
|
||
|
'nlp/corpora/english/2023/text_corpus.txt',
|
||
|
'text_corpus.txt',
|
||
|
),
|
||
|
(
|
||
|
's3://ecommerce-backup/2024/transactions/august/orders_2024_08_28.csv',
|
||
|
'ecommerce-backup',
|
||
|
'2024/transactions/august/orders_2024_08_28.csv',
|
||
|
'orders_2024_08_28.csv',
|
||
|
),
|
||
|
(
|
||
|
's3://gaming-assets/3d_models/characters/hero/model_v5.obj',
|
||
|
'gaming-assets',
|
||
|
'3d_models/characters/hero/model_v5.obj',
|
||
|
'model_v5.obj',
|
||
|
),
|
||
|
(
|
||
|
's3://iot-sensor-data/2024/temperature_sensors/sensor_42_readings.csv',
|
||
|
'iot-sensor-data',
|
||
|
'2024/temperature_sensors/sensor_42_readings.csv',
|
||
|
'sensor_42_readings.csv',
|
||
|
),
|
||
|
(
|
||
|
's3://user-uploads/avatars/user123/avatar_2024_08_29.png',
|
||
|
'user-uploads',
|
||
|
'avatars/user123/avatar_2024_08_29.png',
|
||
|
'avatar_2024_08_29.png',
|
||
|
),
|
||
|
(
|
||
|
's3://media-library/podcasts/2023/episode_45.mp3',
|
||
|
'media-library',
|
||
|
'podcasts/2023/episode_45.mp3',
|
||
|
'episode_45.mp3',
|
||
|
),
|
||
|
(
|
||
|
's3://logs-bucket/security/firewall-logs/2024/08/failed_attempts.log',
|
||
|
'logs-bucket',
|
||
|
'security/firewall-logs/2024/08/failed_attempts.log',
|
||
|
'failed_attempts.log',
|
||
|
),
|
||
|
(
|
||
|
's3://data-warehouse/financials/quarterly/2024/Q1/profit_loss.csv',
|
||
|
'data-warehouse',
|
||
|
'financials/quarterly/2024/Q1/profit_loss.csv',
|
||
|
'profit_loss.csv',
|
||
|
),
|
||
|
(
|
||
|
's3://data-warehouse/financials/quarterly/2024/Q1',
|
||
|
'data-warehouse',
|
||
|
'financials/quarterly/2024/Q1',
|
||
|
'Q1',
|
||
|
),
|
||
|
],
|
||
|
)
|
||
|
def test_s3(raw: str, bucket: str, key: str, last_key: str):
|
||
|
model = S3Check(path=raw)
|
||
|
assert model.path == S3Path(raw)
|
||
|
assert model.path.bucket == bucket
|
||
|
assert model.path.key == key
|
||
|
assert model.path.last_key == last_key
|
||
|
|
||
|
|
||
|
def test_wrong_s3():
|
||
|
with pytest.raises(ValidationError):
|
||
|
S3Check(path='s3/ok')
|