diff --git a/Cargo.lock b/Cargo.lock index 78d46ee..e8e74ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -807,7 +807,6 @@ dependencies = [ "tokio", "tokio-stream", "tokio-util", - "tower", "tower-http", "tracing", "tracing-appender", @@ -1703,9 +1702,9 @@ dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.6", + "rustls", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls", ] [[package]] @@ -1931,11 +1930,15 @@ name = "media" version = "0.6.0" dependencies = [ "axum", + "hyper", "log", "mockall", "rstest", "sea-orm", "serde", + "serde_json", + "tokio", + "tower", "tower-http", ] @@ -2739,14 +2742,14 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.6", + "rustls", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "tokio", "tokio-native-tls", - "tokio-rustls 0.24.1", + "tokio-rustls", "tokio-util", "tower-service", "url", @@ -2879,9 +2882,9 @@ dependencies = [ [[package]] name = "rumqttc" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04483567c64bb8a9d64364a0a9437215a056a2b886140fd66e62a12394cf5998" +checksum = "f2433b134712bc17a6f85a35e06b901e6e8d0bb20b5367e1121e6fedc140c0ac" dependencies = [ "bytes", "flume", @@ -2889,9 +2892,10 @@ dependencies = [ "log", "rustls-native-certs", "rustls-pemfile", + "rustls-webpki 0.100.1", "thiserror", "tokio", - "tokio-rustls 0.23.4", + "tokio-rustls", ] [[package]] @@ -2939,18 +2943,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "rustls" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" -dependencies = [ - "log", - "ring", - "sct", - "webpki", -] - [[package]] name = "rustls" version = "0.21.6" @@ -2959,7 +2951,7 @@ checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" dependencies = [ "log", "ring", - "rustls-webpki", + "rustls-webpki 0.101.3", "sct", ] @@ -2984,6 +2976,16 @@ dependencies = [ "base64 0.21.2", ] +[[package]] +name = "rustls-webpki" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rustls-webpki" version = "0.101.3" @@ -3444,7 +3446,7 @@ dependencies = [ "paste", "percent-encoding", "rust_decimal", - "rustls 0.21.6", + "rustls", "rustls-pemfile", "serde", "serde_json", @@ -3879,24 +3881,13 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.8", - "tokio", - "webpki", -] - [[package]] name = "tokio-rustls" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.6", + "rustls", "tokio", ] @@ -4365,7 +4356,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" dependencies = [ - "rustls-webpki", + "rustls-webpki 0.101.3", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 1e94e58..911710f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,8 @@ anyhow = { version = "1.0.72" } chrono = { version = "0.4.26", features = ["serde"] } +hyper = { version = "0.14", features = ["full"] } + mockall = { version = "0.11.4" } rstest = { version = "0.18.1" } @@ -58,6 +60,7 @@ serde = "1.0.183" serde_json = { version = "1.0.104", features = ["raw_value"] } tokio = { version = "1.30.0", features = ["full"] } +tower = { version = "0.4.13", features = ["util"] } tower-http = { version = "0.4.3", features = ["fs", "tracing", "trace", "cors"] } tracing = "0.1.37" tracing-subscriber = { version = "0.3.17", features = ["registry", "fmt", "std", "json"] } @@ -110,13 +113,13 @@ tracing-appender.workspace = true futures = "0.3.25" futures-channel = "0.3.25" futures-util = "0.3.25" -rumqttc = "0.21.0" + +rumqttc = "0.22.0" tokio.workspace = true tokio-stream = { version = "0.1.11", features = ["net"] } tokio-util = { version = "0.7.4", features = ["rt"] } -tower = { version = "0.4.13", features = ["util"] } tower-http.workspace = true diff --git a/crates/media/Cargo.toml b/crates/media/Cargo.toml index 1e25838..a906252 100644 --- a/crates/media/Cargo.toml +++ b/crates/media/Cargo.toml @@ -18,10 +18,11 @@ doctest = false [dependencies] # serialization serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } # Router axum = { workspace = true } -tower-http.workspace = true +tower-http = { workspace = true } # persistency sea-orm = { workspace = true } @@ -30,3 +31,6 @@ log = "0.4.19" # testing mockall = { workspace = true } rstest = { workspace = true } +tokio = { workspace = true } +tower = { workspace = true, features = ["util"] } +hyper = { workspace = true, features = ["full"] } diff --git a/crates/media/src/api/router.rs b/crates/media/src/api/router.rs index 7e28474..b91ac88 100644 --- a/crates/media/src/api/router.rs +++ b/crates/media/src/api/router.rs @@ -87,3 +87,40 @@ impl MediaApi { .layer(tower_http::trace::TraceLayer::new_for_http()) } } + +#[cfg(test)] +mod tests { + use std::sync::Arc; + + use crate::repository::{MediaRepositoryState, MediaRepository}; + + use super::*; + use axum::{body::Body, http::{Request, StatusCode}}; + use rstest::rstest; + + #[rstest] + #[case("/?name=Wonder")] + #[tokio::test] + async fn get_media_success(#[case] uri: &'static str) { + // given + let repo: MediaRepositoryState = Arc::new(MediaRepository::new().await); + let api: Router = MediaApi::routes().with_state(repo); + + // when + /* + TODO: find replacement for `oneshot` + let response = api::oneshot( + Request::builder() + .uri("/media") + .method("GET") + .body(Body::empty()) + .unwrap() + ).await.unwrap; + let body = hyper::body::to_bytes(response.into_body()).await.unwrap(); + let body = serde_json::from_slice(&body).unwrap(); + + // then + assert_eq!(response.status(), StatusCode::NOT_FOUND); + */ + } +} diff --git a/crates/media/src/repository/mod.rs b/crates/media/src/repository/mod.rs index 0bfcff6..d4c6637 100644 --- a/crates/media/src/repository/mod.rs +++ b/crates/media/src/repository/mod.rs @@ -15,6 +15,8 @@ * along with this program. If not, see . */ +use std::sync::Arc; + use axum::async_trait; use mockall::predicate::*; use sea_orm::DatabaseConnection; @@ -23,11 +25,13 @@ use crate::data::error::DataAccessError; use crate::data::media_item::MediaItem; use crate::data::open_db_conn; -struct MediaRepository { +pub struct MediaRepository { db_url: &'static str, db: DatabaseConnection, } +pub(crate) type MediaRepositoryState = Arc; + /// MockPhotosRepositoryTrait is created by automock macro #[cfg_attr(test, mockall::automock)] #[async_trait] @@ -39,8 +43,12 @@ trait MediaRepositoryTrait { } impl MediaRepository { - // async fn new(&self) { - // } + pub(crate) async fn new() -> Self { + Self { + db_url: "", + db: DatabaseConnection::Disconnected + } + } } #[async_trait] @@ -73,34 +81,34 @@ mod tests { let schema = Schema::new(DbBackend::Sqlite); // Derive from Entity - let stmt: TableCreateStatement = schema.create_table_from_entity(MyEntity); + // let stmt: TableCreateStatement = schema.create_table_from_entity(MyEntity); // Or setup manually - assert_eq!( - stmt.build(SqliteQueryBuilder), - Table::create() - .table(MyEntity) - .col( - ColumnDef::new(MyEntity::Column::Id) - .integer() - .not_null() - ) - //... - .build(SqliteQueryBuilder) - ); + // assert_eq!( + // stmt.build(SqliteQueryBuilder), + // Table::create() + // .table(MyEntity) + // .col( + // ColumnDef::new(MyEntity::Column::Id) + // .integer() + // .not_null() + // ) + // //... + // .build(SqliteQueryBuilder) + // ); - // Execute create table statement - let result = db - .execute(db.get_database_backend().build(&stmt)) - .await; + // // Execute create table statement + // let result = db + // .execute(db.get_database_backend().build(&stmt)) + // .await; } - #[rstest] - #[case("/?name=Wonder", "Wonder%")] // Verify that % is appended to the filter - async fn get_media_items_for_user_success(#[case] uri: &'static str, #[case] expected_filter: &'static str) { + // #[rstest] + // #[case("/?name=Wonder", "Wonder%")] // Verify that % is appended to the filter + // async fn get_media_items_for_user_success(#[case] uri: &'static str, #[case] expected_filter: &'static str) { - let mut repo_mock = MockMediaRepositoryTrait::new("sqlite::memory:"); - setup_schema(&db).await?; - testcase(&db).await?; - } + // let mut repo_mock = MockMediaRepositoryTrait::new("sqlite::memory:"); + // setup_schema(&db).await?; + // testcase(&db).await?; + // } }