Skip to content

Commit 0a3dda7

Browse files
Add rust sdk tests for views (#3755)
# Description of Changes Rust SDK test suite for views # API and ABI breaking changes None # Expected complexity level and risk 1 # Testing This patch only adds tests, it does not change functionality.
1 parent 60e4a64 commit 0a3dda7

23 files changed

Lines changed: 2113 additions & 0 deletions

Cargo.lock

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,12 @@ members = [
4444
"modules/sdk-test",
4545
"modules/sdk-test-connect-disconnect",
4646
"modules/sdk-test-procedure",
47+
"modules/sdk-test-view",
4748
"sdks/rust/tests/test-client",
4849
"sdks/rust/tests/test-counter",
4950
"sdks/rust/tests/connect_disconnect_client",
5051
"sdks/rust/tests/procedure-client",
52+
"sdks/rust/tests/view-client",
5153
"tools/upgrade-version",
5254
"tools/license-check",
5355
"tools/replace-spacetimedb",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[build]
2+
target = "wasm32-unknown-unknown"

modules/sdk-test-view/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "sdk-test-view"
3+
version = "0.1.0"
4+
edition.workspace = true
5+
license-file = "LICENSE"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[lib]
10+
crate-type = ["cdylib"]
11+
12+
[dependencies]
13+
log.workspace = true
14+
anyhow.workspace = true
15+
paste.workspace = true
16+
17+
[dependencies.spacetimedb]
18+
workspace = true

modules/sdk-test-view/LICENSE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../licenses/BSL.txt

modules/sdk-test-view/README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# `sdk-test-view` *Rust* test
2+
3+
This module tests that:
4+
1. Rust client bindings are generated for views
5+
2. You can register callbacks for views just like regular tables
6+
3. Those callbacks are triggered when a view's dependencies are updated
7+
8+
## How to Run
9+
10+
Run tests named with `view` in the [Rust client SDK test suite](../../sdks/rust/tests/test.rs):
11+
12+
```sh
13+
cargo test -p spacetimedb-sdk view
14+
```

modules/sdk-test-view/src/lib.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
use spacetimedb::{
2+
reducer, table, view, AnonymousViewContext, Identity, ReducerContext, SpacetimeType, Table, ViewContext,
3+
};
4+
5+
#[table(name = player)]
6+
struct Player {
7+
#[primary_key]
8+
#[auto_inc]
9+
entity_id: u64,
10+
#[unique]
11+
identity: Identity,
12+
}
13+
14+
#[table(name = player_level)]
15+
struct PlayerLevel {
16+
#[unique]
17+
entity_id: u64,
18+
#[index(btree)]
19+
level: u64,
20+
}
21+
22+
#[derive(SpacetimeType)]
23+
struct PlayerAndLevel {
24+
entity_id: u64,
25+
identity: Identity,
26+
level: u64,
27+
}
28+
29+
#[reducer]
30+
fn insert_player(ctx: &ReducerContext, identity: Identity, level: u64) {
31+
let Player { entity_id, .. } = ctx.db.player().insert(Player { entity_id: 0, identity });
32+
ctx.db.player_level().insert(PlayerLevel { entity_id, level });
33+
}
34+
35+
#[reducer]
36+
fn delete_player(ctx: &ReducerContext, identity: Identity) {
37+
if let Some(player) = ctx.db.player().identity().find(identity) {
38+
ctx.db.player().entity_id().delete(player.entity_id);
39+
ctx.db.player_level().entity_id().delete(player.entity_id);
40+
}
41+
}
42+
43+
#[view(name = my_player, public)]
44+
fn my_player(ctx: &ViewContext) -> Option<Player> {
45+
ctx.db.player().identity().find(ctx.sender)
46+
}
47+
48+
#[view(name = my_player_and_level, public)]
49+
fn my_player_and_level(ctx: &ViewContext) -> Option<PlayerAndLevel> {
50+
ctx.db
51+
.player()
52+
.identity()
53+
.find(ctx.sender)
54+
.and_then(|Player { entity_id, identity }| {
55+
ctx.db
56+
.player_level()
57+
.entity_id()
58+
.find(entity_id)
59+
.map(|PlayerLevel { level, .. }| PlayerAndLevel {
60+
entity_id,
61+
identity,
62+
level,
63+
})
64+
})
65+
}
66+
67+
#[view(name = players_at_level_0, public)]
68+
fn players_at_level_0(ctx: &AnonymousViewContext) -> Vec<Player> {
69+
ctx.db
70+
.player_level()
71+
.level()
72+
.filter(0u64)
73+
.filter_map(|p| ctx.db.player().entity_id().find(p.entity_id))
74+
.collect()
75+
}

sdks/rust/tests/test.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,3 +329,37 @@ macro_rules! procedure_tests {
329329

330330
procedure_tests!(rust_procedures, "");
331331
procedure_tests!(typescript_procedures, "-ts");
332+
333+
mod view {
334+
use spacetimedb_testing::sdk::Test;
335+
336+
const MODULE: &str = "sdk-test-view";
337+
const CLIENT: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/view-client");
338+
339+
fn make_test(subcommand: &str) -> Test {
340+
Test::builder()
341+
.with_name(subcommand)
342+
.with_module(MODULE)
343+
.with_client(CLIENT)
344+
.with_language("rust")
345+
.with_bindings_dir("src/module_bindings")
346+
.with_compile_command("cargo build")
347+
.with_run_command(format!("cargo run -- {}", subcommand))
348+
.build()
349+
}
350+
351+
#[test]
352+
fn subscribe_anonymous_view() {
353+
make_test("view-anonymous-subscribe").run()
354+
}
355+
356+
#[test]
357+
fn subscribe_non_anonymous_view() {
358+
make_test("view-non-anonymous-subscribe").run()
359+
}
360+
361+
#[test]
362+
fn subscribe_view_non_table_return() {
363+
make_test("view-non-table-return").run()
364+
}
365+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[package]
2+
name = "view-client"
3+
version.workspace = true
4+
edition.workspace = true
5+
license-file = "LICENSE"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]
10+
spacetimedb-sdk = { path = "../.." }
11+
spacetimedb-lib.workspace = true
12+
test-counter = { path = "../test-counter" }
13+
anyhow.workspace = true
14+
env_logger.workspace = true
15+
16+
[lints]
17+
workspace = true
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../../licenses/BSL.txt

0 commit comments

Comments
 (0)