Browse Source

Added tavern test plans

develop-tavern
chodak166 3 months ago
parent
commit
65dbfaca25
  1. 32
      apps/app_api/src/api/v1.rs
  2. 13
      apps/app_api/src/api/v1/auth.rs
  3. 3
      tavern-tests/export.sh
  4. 15
      tavern-tests/tavern-run-all.sh
  5. 7
      tavern-tests/tavern-run-single.sh
  6. 29
      tavern-tests/test_plans/decode_test.tavern.yaml
  7. 28
      tavern-tests/test_plans/dictionary_test.tavern.yaml
  8. 44
      tavern-tests/test_plans/encode_test.tavern.yaml
  9. 1
      tavern-tests/test_plans/includes.yaml
  10. 7
      tavern-tests/test_plans/version_test.tavern.yaml

32
apps/app_api/src/api/v1.rs

@ -5,11 +5,21 @@ pub mod major;
use crate::state::AppState; use crate::state::AppState;
use axum::{ use axum::{
Router, extract::Request, extract::State, http::StatusCode, middleware::Next, Json, Router,
response::Response, extract::Request,
extract::State,
http::StatusCode,
middleware::Next,
response::{IntoResponse, Response},
}; };
use serde::Serialize;
use std::sync::Arc; use std::sync::Arc;
#[derive(Debug, Serialize)]
struct ErrorResponseBody {
error: String,
}
pub fn routes(state: Arc<AppState>) -> Router<Arc<AppState>> { pub fn routes(state: Arc<AppState>) -> Router<Arc<AppState>> {
Router::new() Router::new()
.nest("/info", info::routes()) .nest("/info", info::routes())
@ -44,10 +54,10 @@ async fn auth_middleware_inner(
} else if let Some(key) = api_key_header { } else if let Some(key) = api_key_header {
key.to_string() key.to_string()
} else { } else {
return Response::builder() let error = ErrorResponseBody {
.status(StatusCode::UNAUTHORIZED) error: "Missing authorization header or API key".to_string(),
.body("Missing authorization header or API key".into()) };
.unwrap(); return (StatusCode::UNAUTHORIZED, Json(error)).into_response();
}; };
match state.0.dependencies.auth_service.authenticate(&token).await { match state.0.dependencies.auth_service.authenticate(&token).await {
@ -55,9 +65,11 @@ async fn auth_middleware_inner(
request.extensions_mut().insert(claims); request.extensions_mut().insert(claims);
next.run(request).await next.run(request).await
} }
Err(_) => Response::builder() Err(_) => {
.status(StatusCode::UNAUTHORIZED) let error = ErrorResponseBody {
.body("Unauthorized".into()) error: "Unauthorized".to_string(),
.unwrap(), };
(StatusCode::UNAUTHORIZED, Json(error)).into_response()
}
} }
} }

13
apps/app_api/src/api/v1/auth.rs

@ -7,7 +7,7 @@ use crate::state::AppState;
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
pub struct LoginRequest { pub struct LoginRequest {
pub token: String, pub token: Option<String>,
} }
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
@ -21,11 +21,12 @@ pub async fn login_handler(
State(state): State<Arc<AppState>>, State(state): State<Arc<AppState>>,
Json(req): Json<LoginRequest>, Json(req): Json<LoginRequest>,
) -> Result<Json<LoginResponse>, ErrorResponse> { ) -> Result<Json<LoginResponse>, ErrorResponse> {
let claims = state let token = req.token.ok_or_else(|| ErrorResponse {
.dependencies error: "Invalid input".to_string(),
.auth_service message: Some("Token field is required".to_string()),
.authenticate(&req.token) })?;
.await?;
let claims = state.dependencies.auth_service.authenticate(&token).await?;
Ok(Json(LoginResponse { Ok(Json(LoginResponse {
user_id: claims.user_id, user_id: claims.user_id,

3
tavern-tests/export.sh

@ -8,7 +8,8 @@ else
fi fi
export TEST_SERVER_ADDRESS="127.0.0.1:3000" export TEST_SERVER_ADDRESS="127.0.0.1:3000"
export TEST_API_BASE="/api/v1" export TEST_API_BASE="api/v1"
export TEST_API_KEY="test-api-key" export TEST_API_KEY="test-api-key"
export TEST_USER_ID="test-user-id" export TEST_USER_ID="test-user-id"
export TEST_VALID_TOKEN="test-api-key"

15
tavern-tests/tavern-run-all.sh

@ -1,13 +1,20 @@
#!/usr/bin/env bash #!/usr/bin/env bash
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
cd "$SCRIPT_DIR"
if [ -z "$TEST_SERVER_ADDRESS" ]; then if [ -z "$TEST_SERVER_ADDRESS" ]; then
source export.sh source export.sh
fi fi
tavern-ci --alluredir=reports test_plans/info_test.tavern.yaml tavern-ci --alluredir=reports test_plans/version_test.tavern.yaml
# tavern-ci --alluredir=reports test_plans/auth_test.tavern.yaml
tavern-ci --alluredir=reports test_plans/decode_test.tavern.yaml
tavern-ci --alluredir=reports test_plans/dictionary_test.tavern.yaml
tavern-ci --alluredir=reports test_plans/encode_test.tavern.yaml
if command -v allure > /dev/null; then # if command -v allure > /dev/null; then
allure generate --clean --single-file --output /tmp/vm-allure-report --name index.html reports # allure generate --clean --single-file --output /tmp/vm-allure-report --name index.html reports
fi # fi
# allure package: https://github.com/allure-framework/allure2/releases/download/2.34.0/allure_2.34.0-1_all.deb # allure package: https://github.com/allure-framework/allure2/releases/download/2.34.0/allure_2.34.0-1_all.deb

7
tavern-tests/tavern-run-single.sh

@ -1,5 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
cd "$SCRIPT_DIR"
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "Usage: $0 <test plan>" echo "Usage: $0 <test plan>"
exit 1 exit 1
@ -9,8 +12,8 @@ if [ -z "$TEST_SERVER_ADDRESS" ]; then
source export.sh source export.sh
fi fi
tavern-ci --alluredir=reports $1 tavern-ci --log-cli-level=DEBUG --alluredir=reports $1
allure generate --clean --single-file --output /tmp/vm-allure-report --name index.html reports # allure generate --clean --single-file --output /tmp/vm-allure-report --name index.html reports
# allure package: https://github.com/allure-framework/allure2/releases/download/2.34.0/allure_2.34.0-1_all.deb # allure package: https://github.com/allure-framework/allure2/releases/download/2.34.0/allure_2.34.0-1_all.deb

29
tavern-tests/test_plans/decode_test.tavern.yaml

@ -0,0 +1,29 @@
test_name: "Test major decode endpoint"
includes:
- !include includes.yaml
stages:
- name: "Successful decode with valid encoded input"
request:
url: "http://{server_address}/{api_base}/major/decode/pl/hello"
method: GET
headers:
X-API-Key: "{api_key}"
response:
strict: False
status_code: 200
json:
input: "hello"
result: !anystr
- name: "Missing authentication returns 401 error"
request:
url: "http://{server_address}/{api_base}/major/decode/pl/hello"
method: GET
response:
strict: False
status_code: 401
json:
error: !anystr

28
tavern-tests/test_plans/dictionary_test.tavern.yaml

@ -0,0 +1,28 @@
test_name: "Test dictionary API endpoint"
includes:
- !include includes.yaml
stages:
- name: "Successful list dictionaries with valid authentication"
request:
url: "http://{server_address}/{api_base}/dicts"
method: GET
headers:
X-API-Key: "{api_key}"
response:
strict: False
status_code: 200
json:
dictionaries: !anylist
- name: "Missing authentication returns 401 error"
request:
url: "http://{server_address}/{api_base}/dicts"
method: GET
response:
strict: False
status_code: 401
json:
error: !anystr

44
tavern-tests/test_plans/encode_test.tavern.yaml

@ -0,0 +1,44 @@
test_name: "Test major encode endpoint"
includes:
- !include includes.yaml
stages:
- name: "Successful encode with default dictionary"
request:
url: "http://{server_address}/{api_base}/major/encode/pl/hello"
method: GET
headers:
X-API-Key: "{api_key}"
response:
strict: False
status_code: 200
json:
input: "hello"
dict: "demo_pl"
result: !anylist
- name: "Successful encode with custom dictionary"
request:
url: "http://{server_address}/{api_base}/major/encode/pl/test?dict=demo_pl"
method: GET
headers:
X-API-Key: "{api_key}"
response:
strict: False
status_code: 200
json:
input: "test"
dict: "demo_pl"
result: !anylist
- name: "Missing authentication returns 401 error"
request:
url: "http://{server_address}/{api_base}/major/encode/pl/hello"
method: GET
response:
strict: False
status_code: 401
json:
error: !anystr

1
tavern-tests/test_plans/includes.yaml

@ -3,3 +3,4 @@ variables:
api_base: "{tavern.env_vars.TEST_API_BASE}" api_base: "{tavern.env_vars.TEST_API_BASE}"
api_key: "{tavern.env_vars.TEST_API_KEY}" api_key: "{tavern.env_vars.TEST_API_KEY}"
user_id: "{tavern.env_vars.TEST_USER_ID}" user_id: "{tavern.env_vars.TEST_USER_ID}"

7
tavern-tests/test_plans/info_test.tavern.yaml → tavern-tests/test_plans/version_test.tavern.yaml

@ -1,12 +1,12 @@
test_name: "Test server API info endpoint" test_name: "Test version endpoint"
includes: includes:
- !include includes.yaml - !include includes.yaml
stages: stages:
- name: "Check version" - name: "Successful version test - valid authentication returns version info"
request: request:
url: "http://{server_address}/{api_base}/info/version" url: "http://{server_address}/api/v1/info/version"
method: GET method: GET
headers: headers:
X-API-Key: "{api_key}" X-API-Key: "{api_key}"
@ -17,3 +17,4 @@ stages:
name: !anystr name: !anystr
version: !anystr version: !anystr
Loading…
Cancel
Save