diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9b2bbb2..9add48b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Rust +name: build and test on: push: @@ -10,13 +10,53 @@ env: CARGO_TERM_COLOR: always jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Lint + run: | + cargo clippy -- -D warnings + build: + needs: [ "lint" ] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - name: Checkout repository + uses: actions/checkout@v2 + - name: Build - run: cargo build --verbose + run: | + cargo build --verbose + + test: + needs: [ "build" ] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + - name: Run tests env: JWT_SECRET: ${{ secrets.JWT_SECRET }} - run: cargo test --verbose \ No newline at end of file + run: | + cargo test --verbose + + coverage: + needs: [ "build" ] + name: coverage + runs-on: ubuntu-latest + container: + image: xd009642/tarpaulin:develop-nightly + options: --security-opt seccomp=unconfined + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Generate code coverage + env: + JWT_SECRET: ${{ secrets.JWT_SECRET }} + run: | + cargo +nightly tarpaulin --verbose --all-features --workspace --timeout 120 \ No newline at end of file diff --git a/src/api/query.rs b/src/api/query.rs index a9786c0..f8f70ae 100644 --- a/src/api/query.rs +++ b/src/api/query.rs @@ -16,11 +16,11 @@ pub struct Pagination { impl Pagination { pub fn get_offset(&self) -> i64 { - self.offset.unwrap_or_else(|| DEFAULT_PAGINATION_OFFSET) + self.offset.unwrap_or(DEFAULT_PAGINATION_OFFSET) } pub fn get_limit(&self) -> i64 { - self.limit.unwrap_or_else(|| DEFAULT_PAGINATION_LIMIT) + self.limit.unwrap_or(DEFAULT_PAGINATION_LIMIT) } } diff --git a/src/api/v1/list_messages.rs b/src/api/v1/list_messages.rs index 2a3fb65..dbc940c 100644 --- a/src/api/v1/list_messages.rs +++ b/src/api/v1/list_messages.rs @@ -82,18 +82,15 @@ mod tests { .returning(|_, _| { Box::pin(async { let posted_at = - DateTime::parse_from_rfc3339("2020-04-12T22:10:57+02:00".as_ref()).unwrap(); + DateTime::parse_from_rfc3339("2020-04-12T22:10:57+02:00").unwrap(); let posted_at_utc = posted_at.with_timezone(&Utc); - let mut exp_messages = vec![]; - exp_messages.push(domain::message::Message { + Ok(vec![domain::message::Message { message_id: 1, message_content: "test".to_string(), user_id: 123, posted_at: posted_at_utc, - }); - - Ok(exp_messages) + }]) }) }); diff --git a/src/api/v1/login.rs b/src/api/v1/login.rs index 278c2fc..36c7077 100644 --- a/src/api/v1/login.rs +++ b/src/api/v1/login.rs @@ -69,6 +69,6 @@ mod tests { let body = response.into_body().collect().await.unwrap().to_bytes(); let login_response: entities::auth::LoginResponse = serde_json::from_slice(&body).unwrap(); - assert!(login_response.token.len() > 0); + assert!(!login_response.token.is_empty()); } } diff --git a/src/api/v1/post_message.rs b/src/api/v1/post_message.rs index 9de15d8..61937b9 100644 --- a/src/api/v1/post_message.rs +++ b/src/api/v1/post_message.rs @@ -79,7 +79,7 @@ mod tests { messages_repository .expect_create_message() - .withf(|x| x.content == "test-msg".to_string() && x.user_id == 123) + .withf(|x| x.content == *"test-msg" && x.user_id == 123) .once() .returning(|_| Box::pin(async { Ok(1) })); diff --git a/src/bin/chat/entrypoint.rs b/src/bin/chat/entrypoint.rs index 512ffdd..696ac3d 100644 --- a/src/bin/chat/entrypoint.rs +++ b/src/bin/chat/entrypoint.rs @@ -13,7 +13,7 @@ pub struct Entrypoint<'a> { closer: Closer<'a>, } -impl<'a> Entrypoint<'_> { +impl Entrypoint<'_> { pub fn new(config: Config) -> Self { Self { config, diff --git a/src/core_utils/closer.rs b/src/core_utils/closer.rs index ed8599a..c1909c3 100644 --- a/src/core_utils/closer.rs +++ b/src/core_utils/closer.rs @@ -4,6 +4,12 @@ pub struct Closer<'a> { closers: Vec>, } +impl Default for Closer<'_> { + fn default() -> Self { + Self::new() + } +} + impl<'a> Closer<'a> { pub fn new() -> Closer<'a> { Closer { closers: vec![] } diff --git a/src/core_utils/postgres_pool.rs b/src/core_utils/postgres_pool.rs index 6761c82..269a082 100644 --- a/src/core_utils/postgres_pool.rs +++ b/src/core_utils/postgres_pool.rs @@ -52,16 +52,16 @@ pub fn build_pool_from_config( let mut conn_opts = deadpool_postgres::Config::new(); conn_opts.application_name = Some(client_id); conn_opts.host = Some(config.host.clone()); - conn_opts.port = Some(config.port.clone()); + conn_opts.port = Some(config.port); conn_opts.user = Some(config.user.clone()); conn_opts.password = Some(config.password.clone()); conn_opts.dbname = Some(config.db.clone()); - conn_opts.connect_timeout = Some(Duration::from( - >::into(config.connect_timeout), + conn_opts.connect_timeout = Some(>::into( + config.connect_timeout, )); conn_opts.keepalives = Some(config.keepalives); - conn_opts.keepalives_idle = Some(Duration::from( - >::into(config.keepalives_idle), + conn_opts.keepalives_idle = Some(>::into( + config.keepalives_idle, )); conn_opts.target_session_attrs = Some(config.get_target_session_attrs()); conn_opts.manager = Some(deadpool_postgres::ManagerConfig { @@ -69,11 +69,11 @@ pub fn build_pool_from_config( }); conn_opts.pool = Some(deadpool_postgres::PoolConfig { timeouts: deadpool_postgres::Timeouts { - wait: Some(Duration::from( - >::into(config.wait_timeout), + wait: Some(>::into( + config.wait_timeout, )), - create: Some(Duration::from( - >::into(config.create_timeout), + create: Some(>::into( + config.create_timeout, )), ..Default::default() }, diff --git a/src/core_utils/swagger.rs b/src/core_utils/swagger.rs index feafeba..6f8dd71 100644 --- a/src/core_utils/swagger.rs +++ b/src/core_utils/swagger.rs @@ -17,7 +17,6 @@ pub fn get_openapi_router(router: OpenApiRouter) -> Router { (url = "http://localhost:9000", description = "local") ) )] - struct ApiDoc; pub struct SecurityAddon; @@ -42,7 +41,7 @@ pub fn get_openapi_router(router: OpenApiRouter) -> Router { .merge(router) .split_for_parts(); - let router = router + router .merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", api.clone())) .merge(Redoc::with_url("/redoc", api.clone())) // There is no need to create `RapiDoc::with_openapi` because the OpenApi is served @@ -50,7 +49,5 @@ pub fn get_openapi_router(router: OpenApiRouter) -> Router { .merge(RapiDoc::new("/api-docs/openapi.json").path("/rapidoc")) // Alternative to above // .merge(RapiDoc::with_openapi("/api-docs/openapi2.json", api).path("/rapidoc")) - .merge(Scalar::with_url("/scalar", api)); - - router + .merge(Scalar::with_url("/scalar", api)) } diff --git a/src/infra/repositories/messages.rs b/src/infra/repositories/messages.rs index 48c3b9a..8ca33f0 100644 --- a/src/infra/repositories/messages.rs +++ b/src/infra/repositories/messages.rs @@ -76,9 +76,6 @@ impl MessagesRepositoryTrait for MessagesRepository { let rows = client.query(&stmt, &[&offset, &limit]).await?; - Ok(rows - .iter() - .map(|row| message::Message::try_from(row).unwrap()) - .collect()) + Ok(rows.iter().map(message::Message::from).collect()) } }