Skip to content

Commit 3a89e9a

Browse files
Add rust sdk tests exercising on_update for views
1 parent 414abad commit 3a89e9a

24 files changed

Lines changed: 2786 additions & 1 deletion

Cargo.lock

Lines changed: 17 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
@@ -50,12 +50,14 @@ members = [
5050
"modules/sdk-test-connect-disconnect",
5151
"modules/sdk-test-procedure",
5252
"modules/sdk-test-view",
53+
"modules/sdk-test-view-pk",
5354
"modules/sdk-test-event-table",
5455
"sdks/rust/tests/test-client",
5556
"sdks/rust/tests/test-counter",
5657
"sdks/rust/tests/connect_disconnect_client",
5758
"sdks/rust/tests/procedure-client",
5859
"sdks/rust/tests/view-client",
60+
"sdks/rust/tests/view-pk-client",
5961
"sdks/rust/tests/event-table-client",
6062
"tools/ci",
6163
"tools/upgrade-version",
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[package]
2+
name = "sdk-test-view-pk"
3+
version = "0.1.0"
4+
edition.workspace = true
5+
license-file = "LICENSE"
6+
7+
[lib]
8+
crate-type = ["cdylib"]
9+
10+
[dependencies]
11+
spacetimedb.workspace = true
12+
13+
[lints]
14+
workspace = true
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
use spacetimedb::{reducer, table, view, Query, ReducerContext, Table, ViewContext};
2+
3+
#[table(accessor = view_pk_player, public)]
4+
pub struct ViewPkPlayer {
5+
#[primary_key]
6+
pub id: u64,
7+
pub name: String,
8+
}
9+
10+
#[table(accessor = view_pk_membership, public)]
11+
pub struct ViewPkMembership {
12+
#[primary_key]
13+
pub id: u64,
14+
#[index(btree)]
15+
pub player_id: u64,
16+
}
17+
18+
#[table(accessor = view_pk_membership_secondary, public)]
19+
pub struct ViewPkMembershipSecondary {
20+
#[primary_key]
21+
pub id: u64,
22+
#[index(btree)]
23+
pub player_id: u64,
24+
}
25+
26+
#[reducer]
27+
pub fn insert_view_pk_player(ctx: &ReducerContext, id: u64, name: String) {
28+
ctx.db.view_pk_player().insert(ViewPkPlayer { id, name });
29+
}
30+
31+
#[reducer]
32+
pub fn update_view_pk_player(ctx: &ReducerContext, id: u64, name: String) {
33+
ctx.db.view_pk_player().id().update(ViewPkPlayer { id, name });
34+
}
35+
36+
#[reducer]
37+
pub fn insert_view_pk_membership(ctx: &ReducerContext, id: u64, player_id: u64) {
38+
ctx.db.view_pk_membership().insert(ViewPkMembership { id, player_id });
39+
}
40+
41+
#[reducer]
42+
pub fn insert_view_pk_membership_secondary(ctx: &ReducerContext, id: u64, player_id: u64) {
43+
ctx.db
44+
.view_pk_membership_secondary()
45+
.insert(ViewPkMembershipSecondary { id, player_id });
46+
}
47+
48+
#[view(accessor = all_view_pk_players, public)]
49+
pub fn all_view_pk_players(ctx: &ViewContext) -> impl Query<ViewPkPlayer> {
50+
ctx.from.view_pk_player()
51+
}
52+
53+
#[view(accessor = sender_view_pk_players_a, public)]
54+
pub fn sender_view_pk_players_a(ctx: &ViewContext) -> impl Query<ViewPkPlayer> {
55+
ctx.from
56+
.view_pk_membership()
57+
.right_semijoin(ctx.from.view_pk_player(), |membership, player| {
58+
membership.player_id.eq(player.id)
59+
})
60+
}
61+
62+
#[view(accessor = sender_view_pk_players_b, public)]
63+
pub fn sender_view_pk_players_b(ctx: &ViewContext) -> impl Query<ViewPkPlayer> {
64+
ctx.from
65+
.view_pk_membership_secondary()
66+
.right_semijoin(ctx.from.view_pk_player(), |membership, player| {
67+
membership.player_id.eq(player.id)
68+
})
69+
}

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

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use spacetimedb::{
2-
reducer, table, view, AnonymousViewContext, Identity, ReducerContext, SpacetimeType, Table, ViewContext,
2+
reducer, table, view, AnonymousViewContext, Identity, Query, ReducerContext, SpacetimeType, Table, ViewContext,
33
};
44

55
#[table(accessor = player, public)]
@@ -36,6 +36,41 @@ struct PlayerAndLevel {
3636
level: u64,
3737
}
3838

39+
#[table(accessor = view_pk_player, public)]
40+
pub struct ViewPkPlayer {
41+
#[primary_key]
42+
pub id: u64,
43+
pub name: String,
44+
}
45+
46+
#[table(accessor = view_pk_membership, public)]
47+
pub struct ViewPkMembership {
48+
#[primary_key]
49+
pub id: u64,
50+
#[index(btree)]
51+
pub player_id: u64,
52+
}
53+
54+
#[reducer]
55+
pub fn insert_view_pk_player(ctx: &ReducerContext, id: u64, name: String) {
56+
ctx.db.view_pk_player().insert(ViewPkPlayer { id, name });
57+
}
58+
59+
#[reducer]
60+
pub fn update_view_pk_player(ctx: &ReducerContext, id: u64, name: String) {
61+
ctx.db.view_pk_player().id().update(ViewPkPlayer { id, name });
62+
}
63+
64+
#[reducer]
65+
pub fn insert_view_pk_membership(ctx: &ReducerContext, id: u64, player_id: u64) {
66+
ctx.db.view_pk_membership().insert(ViewPkMembership { id, player_id });
67+
}
68+
69+
#[view(accessor = all_view_pk_players, public)]
70+
pub fn all_view_pk_players(ctx: &ViewContext) -> impl Query<ViewPkPlayer> {
71+
ctx.from.view_pk_player()
72+
}
73+
3974
#[reducer]
4075
fn insert_player(ctx: &ReducerContext, identity: Identity, level: u64) {
4176
let Player { entity_id, .. } = ctx.db.player().insert(Player { entity_id: 0, identity });

sdks/rust/tests/test.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,3 +488,43 @@ macro_rules! view_tests {
488488

489489
view_tests!(rust_view, "");
490490
view_tests!(cpp_view, "-cpp");
491+
492+
macro_rules! view_pk_tests {
493+
($mod_name:ident, $suffix:literal) => {
494+
mod $mod_name {
495+
use spacetimedb_testing::sdk::Test;
496+
497+
const MODULE: &str = concat!("sdk-test-view-pk", $suffix);
498+
const CLIENT: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/view-pk-client");
499+
500+
fn make_test(subcommand: &str) -> Test {
501+
Test::builder()
502+
.with_name(subcommand)
503+
.with_module(MODULE)
504+
.with_client(CLIENT)
505+
.with_language("rust")
506+
.with_bindings_dir("src/module_bindings")
507+
.with_compile_command("cargo build")
508+
.with_run_command(format!("cargo run -- {}", subcommand))
509+
.build()
510+
}
511+
512+
#[test]
513+
fn query_builder_view_with_pk_on_update_callback() {
514+
make_test("view-pk-on-update").run()
515+
}
516+
517+
#[test]
518+
fn query_builder_join_table_with_view_pk() {
519+
make_test("view-pk-join-query-builder").run()
520+
}
521+
522+
#[test]
523+
fn query_builder_semijoin_two_sender_views_with_pk() {
524+
make_test("view-pk-semijoin-two-sender-views-query-builder").run()
525+
}
526+
}
527+
};
528+
}
529+
530+
view_pk_tests!(rust_view_pk, "");
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[package]
2+
name = "view-pk-client"
3+
version.workspace = true
4+
edition.workspace = true
5+
license-file = "LICENSE"
6+
7+
[dependencies]
8+
spacetimedb-sdk = { path = "../.." }
9+
test-counter = { path = "../test-counter" }
10+
anyhow.workspace = true
11+
env_logger.workspace = true
12+
13+
[lints]
14+
workspace = true
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../../licenses/BSL.txt
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
This test client is used with the module:
2+
3+
- [`sdk-test-view-pk`](/modules/sdk-test-view-pk)
4+
5+
To (re-)generate the `module_bindings`, from this directory, run:
6+
7+
```sh
8+
mkdir -p src/module_bindings
9+
spacetime generate --lang rust --out-dir src/module_bindings --module-path ../../../../modules/sdk-test-view-pk
10+
```

0 commit comments

Comments
 (0)