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. 5
      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 axum::{
Router, extract::Request, extract::State, http::StatusCode, middleware::Next,
response::Response,
Json, Router,
extract::Request,
extract::State,
http::StatusCode,
middleware::Next,
response::{IntoResponse, Response},
};
use serde::Serialize;
use std::sync::Arc;
#[derive(Debug, Serialize)]
struct ErrorResponseBody {
error: String,
}
pub fn routes(state: Arc<AppState>) -> Router<Arc<AppState>> {
Router::new()
.nest("/info", info::routes())
@ -44,10 +54,10 @@ async fn auth_middleware_inner(
} else if let Some(key) = api_key_header {
key.to_string()
} else {
return Response::builder()
.status(StatusCode::UNAUTHORIZED)
.body("Missing authorization header or API key".into())
.unwrap();
let error = ErrorResponseBody {
error: "Missing authorization header or API key".to_string(),
};
return (StatusCode::UNAUTHORIZED, Json(error)).into_response();
};
match state.0.dependencies.auth_service.authenticate(&token).await {
@ -55,9 +65,11 @@ async fn auth_middleware_inner(
request.extensions_mut().insert(claims);
next.run(request).await
}
Err(_) => Response::builder()
.status(StatusCode::UNAUTHORIZED)
.body("Unauthorized".into())
.unwrap(),
Err(_) => {
let error = ErrorResponseBody {
error: "Unauthorized".to_string(),
};
(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)]
pub struct LoginRequest {
pub token: String,
pub token: Option<String>,
}
#[derive(Debug, Serialize)]
@ -21,11 +21,12 @@ pub async fn login_handler(
State(state): State<Arc<AppState>>,
Json(req): Json<LoginRequest>,
) -> Result<Json<LoginResponse>, ErrorResponse> {
let claims = state
.dependencies
.auth_service
.authenticate(&req.token)
.await?;
let token = req.token.ok_or_else(|| ErrorResponse {
error: "Invalid input".to_string(),
message: Some("Token field is required".to_string()),
})?;
let claims = state.dependencies.auth_service.authenticate(&token).await?;
Ok(Json(LoginResponse {
user_id: claims.user_id,

5
tavern-tests/export.sh

@ -8,7 +8,8 @@ else
fi
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_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
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
cd "$SCRIPT_DIR"
if [ -z "$TEST_SERVER_ADDRESS" ]; then
source export.sh
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
allure generate --clean --single-file --output /tmp/vm-allure-report --name index.html reports
fi
# if command -v allure > /dev/null; then
# allure generate --clean --single-file --output /tmp/vm-allure-report --name index.html reports
# fi
# 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
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
cd "$SCRIPT_DIR"
if [ -z "$1" ]; then
echo "Usage: $0 <test plan>"
exit 1
@ -9,8 +12,8 @@ if [ -z "$TEST_SERVER_ADDRESS" ]; then
source export.sh
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

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_key: "{tavern.env_vars.TEST_API_KEY}"
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:
- !include includes.yaml
stages:
- name: "Check version"
- name: "Successful version test - valid authentication returns version info"
request:
url: "http://{server_address}/{api_base}/info/version"
url: "http://{server_address}/api/v1/info/version"
method: GET
headers:
X-API-Key: "{api_key}"
@ -17,3 +17,4 @@ stages:
name: !anystr
version: !anystr
Loading…
Cancel
Save