add basic private demo tests

This commit is contained in:
Robin Appelman 2025-05-03 17:25:55 +02:00
commit 24dddb5e6d
9 changed files with 509 additions and 281 deletions

3
.env
View file

@ -1,3 +1,4 @@
DB_URL=postgres://postgres:test@localhost:15432/postgres DB_URL=postgres://postgres:test@localhost:15432/postgres
BASE_URL=http://localhost:8888 BASE_URL=http://localhost:8888
EDIT_KEY=edit EDIT_KEY=edit
ACCESS_KEY=access

666
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -5,7 +5,7 @@ authors = ["Robin Appelman <robin@icewind.nl>"]
edition = "2018" edition = "2018"
[dependencies] [dependencies]
demostf-client = { version = "0.4.5" } demostf-client = { version = "0.4.6" }
sqlx = { version = "0.6.0", features = ["postgres", "runtime-tokio-rustls"] } sqlx = { version = "0.6.0", features = ["postgres", "runtime-tokio-rustls"] }
dotenv = "0.15.0" dotenv = "0.15.0"
color-eyre = "0.6.1" color-eyre = "0.6.1"

View file

@ -11,5 +11,6 @@ Start the test with the following environment variables
- `DB_URL` - [sqlx](https://github.com/launchbadge/sqlx) database url for the database used by the api - `DB_URL` - [sqlx](https://github.com/launchbadge/sqlx) database url for the database used by the api
- `BASE_URL` - base url for the api - `BASE_URL` - base url for the api
- `EDIT_KEY` - edit key for the api - `EDIT_KEY` - edit key for the api
- `ACCESS_KEY` - access key for the api
Note that the test suite is destructive, all data saved in the database will be wiped for each test run. Note that the test suite is destructive, all data saved in the database will be wiped for each test run.

30
flake.lock generated
View file

@ -2,11 +2,11 @@
"nodes": { "nodes": {
"crane": { "crane": {
"locked": { "locked": {
"lastModified": 1733688869, "lastModified": 1742394900,
"narHash": "sha256-KrhxxFj1CjESDrL5+u/zsVH0K+Ik9tvoac/oFPoxSB8=", "narHash": "sha256-vVOAp9ahvnU+fQoKd4SEXB2JG2wbENkpqcwlkIXgUC0=",
"owner": "ipetkov", "owner": "ipetkov",
"repo": "crane", "repo": "crane",
"rev": "604637106e420ad99907cae401e13ab6b452e7d9", "rev": "70947c1908108c0c551ddfd73d4f750ff2ea67cd",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -22,11 +22,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1734957624, "lastModified": 1745844883,
"narHash": "sha256-RbvX9lf9lWQwG9vTXkscOiWTrKf8lzjyeOvW/v8IuBY=", "narHash": "sha256-4t9eR291RIgYo29MvRQ04QgmjZNad3e5sBr40tLhLTM=",
"owner": "nix-community", "owner": "nix-community",
"repo": "flakelight", "repo": "flakelight",
"rev": "8c226ea0166784b02d4a58fbb015f9c01250221e", "rev": "78ad7409722c554effa360208417244c54ef398f",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -44,11 +44,11 @@
"rust-overlay": "rust-overlay" "rust-overlay": "rust-overlay"
}, },
"locked": { "locked": {
"lastModified": 1735052218, "lastModified": 1745623947,
"narHash": "sha256-I30wh6G8fSUO4EseexxiDXcxyUhXR6C8BvEeKn6xyfE=", "narHash": "sha256-7Jt9a6YjBeRPso1VaRsH6ZnqNzt+MlcmVM7MNBSLVEI=",
"owner": "icewind1991", "owner": "icewind1991",
"repo": "mill-scale", "repo": "mill-scale",
"rev": "7e45bb598ff63a8416ee3c26743b20644563bd93", "rev": "45597aa1134a3ea397c4441e36ac1d836a5de000",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -59,11 +59,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1734875076, "lastModified": 1746183838,
"narHash": "sha256-Pzyb+YNG5u3zP79zoi8HXYMs15Q5dfjDgwCdUI5B0nY=", "narHash": "sha256-kwaaguGkAqTZ1oK0yXeQ3ayYjs8u/W7eEfrFpFfIDFA=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "1807c2b91223227ad5599d7067a61665c52d1295", "rev": "bf3287dac860542719fe7554e21e686108716879",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -88,11 +88,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1733884434, "lastModified": 1742697269,
"narHash": "sha256-8GXR9kC07dyOIshAyfZhG11xfvBRSZzYghnZ2weOKJU=", "narHash": "sha256-Lpp0XyAtIl1oGJzNmTiTGLhTkcUjwSkEb0gOiNzYFGM=",
"owner": "oxalica", "owner": "oxalica",
"repo": "rust-overlay", "repo": "rust-overlay",
"rev": "d0483df44ddf0fd1985f564abccbe568e020ddf2", "rev": "01973c84732f9275c50c5f075dd1f54cc04b3316",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -15,8 +15,8 @@ in
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "demostf"; owner = "demostf";
repo = "api"; repo = "api";
rev = "1a8380360b993226ae1c6fcc226011e03a6c1467"; rev = "52b9bc09fd187bf3bbc11dbe4443af0e07a716a4";
hash = "sha256-JcBRU1N44tt0QDLnj6z9MCT3V2s2dkf+JbpWb1rmXnY="; hash = "sha256-iMU7C2g76w5d5CtxRW5H50FxY+UlOc5gSpjxxbVyqUw=";
}; };
vendorHash = "sha256-EYWCR2aJAoyWvEX+SML4Fb3F3KGcUtwCgqhAGT6ZjZ4="; vendorHash = "sha256-EYWCR2aJAoyWvEX+SML4Fb3F3KGcUtwCgqhAGT6ZjZ4=";

View file

@ -96,6 +96,7 @@
DB_USERNAME = "demostf"; DB_USERNAME = "demostf";
APP_ROOT = "http://localhost"; APP_ROOT = "http://localhost";
EDIT_SECRET = "edit"; EDIT_SECRET = "edit";
ACCESS_KEY = "access";
PARSER_PATH = "${pkgs.demostf-parser}/bin/parse_demo"; PARSER_PATH = "${pkgs.demostf-parser}/bin/parse_demo";
}; };
user = "demostf"; user = "demostf";
@ -108,7 +109,7 @@
testBinary = lib.getExe pkgs.demostf-api-test; testBinary = lib.getExe pkgs.demostf-api-test;
initSql = pkgs.fetchurl { initSql = pkgs.fetchurl {
url = "https://github.com/demostf/db/raw/refs/heads/master/schema.sql"; url = "https://github.com/demostf/db/raw/refs/heads/master/schema.sql";
hash = "sha256-AwXN9mh9CRk6HWdvyUR+YdBkpmExNIDOIeDMz6XqjEQ="; hash = "sha256-tdMYDxlvpuQRxHglX46sCldxzsh1cDxkch2lGWnFH8E=";
}; };
in '' in ''
machine.succeed("mkdir /demos && chmod 0777 /demos"); machine.succeed("mkdir /demos && chmod 0777 /demos");
@ -120,6 +121,7 @@
machine.wait_until_succeeds("curl http://127.0.0.1", timeout=45) machine.wait_until_succeeds("curl http://127.0.0.1", timeout=45)
machine.succeed("DB_URL='postgres://demostf:test@localhost/demostf'\ machine.succeed("DB_URL='postgres://demostf:test@localhost/demostf'\
BASE_URL='http://localhost/'\ BASE_URL='http://localhost/'\
ACCESS_KEY='access'\
EDIT_KEY='edit'\ EDIT_KEY='edit'\
${testBinary}", timeout=180) ${testBinary}", timeout=180)
''; '';

View file

@ -29,6 +29,8 @@ async fn main() -> Result<()> {
let edit_key = dotenv::var("EDIT_KEY")?; let edit_key = dotenv::var("EDIT_KEY")?;
let edit_key = &edit_key; let edit_key = &edit_key;
let access_key = dotenv::var("ACCESS_KEY")?;
let access_key = &access_key;
let mut success = true; let mut success = true;
@ -578,6 +580,84 @@ async fn main() -> Result<()> {
}) })
.await; .await;
success &= Test::run("Private demos", &harness, |test| async move {
let id = test
.step("upload", |client| async move {
Ok(client
.upload_private_demo(
String::from("test.dem"),
granary_data.to_vec(),
String::from("RED"),
String::from("BLUE"),
String::from("token"),
)
.await?)
})
.await?;
assert_eq(id, 1)?;
test.step("get without key", |client| async move {
let demo = client.get(id).await?;
assert_object_eq!(demo => {
id == 1,
name == "test.dem",
map == "cp_granary_pro_rc8",
red_score == 0,
blue_score == 1,
player_count == 12,
url == "",
backend == "",
});
Ok(())
})
.await?;
test.step("get with key", |client| async move {
let mut client = client.clone();
client.set_access_key(access_key.clone());
let demo = client.get(id).await?;
assert_object_eq!(demo => {
id == 1,
name == "test.dem",
map == "cp_granary_pro_rc8",
red_score == 0,
blue_score == 1,
player_count == 12,
url == "https://localhost/ec/68/ec681d1b4846a7e3cb2c129fcbd858ac_test.dem",
backend == "static",
});
Ok(())
})
.await?;
test.step("get with wrong key", |client| async move {
let mut client = client.clone();
client.set_access_key("wrong".into());
let demo = client.get(id).await?;
assert_object_eq!(demo => {
id == 1,
name == "test.dem",
map == "cp_granary_pro_rc8",
red_score == 0,
blue_score == 1,
player_count == 12,
url == "",
backend == "",
});
Ok(())
})
.await?;
Ok(())
})
.await;
if !success { if !success {
std::process::exit(1); std::process::exit(1);
} }

View file

@ -11,6 +11,6 @@ docker run -d --name api-test-db -e POSTGRES_PASSWORD=test -p 15432:5432 demostf
docker run -d --name api-test-fpm --link api-test-db:db -v /tmp/api-test-data:/demos \ docker run -d --name api-test-fpm --link api-test-db:db -v /tmp/api-test-data:/demos \
-e DEMO_ROOT=/demos -e DEMO_HOST=localhost -e DB_TYPE=pgsql \ -e DEMO_ROOT=/demos -e DEMO_HOST=localhost -e DB_TYPE=pgsql \
-e DB_HOST=db -e DB_PORT=5432 -e DB_DATABASE=postgres -e DB_USERNAME=postgres \ -e DB_HOST=db -e DB_PORT=5432 -e DB_DATABASE=postgres -e DB_USERNAME=postgres \
-e DB_PASSWORD=test -e APP_ROOT=http://api.localhost -e EDIT_SECRET=edit \ -e DB_PASSWORD=test -e APP_ROOT=http://api.localhost -e EDIT_SECRET=edit -e ACCESS_KEY=access \
demostf/api demostf/api
docker run -d --name api-test --link api-test-fpm:api -p 8888:80 demostf/api-nginx-test docker run -d --name api-test --link api-test-fpm:api -p 8888:80 demostf/api-nginx-test