Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,12 @@ members = [
"modules/sdk-test",
"modules/sdk-test-connect-disconnect",
"modules/sdk-test-procedure",
"modules/sdk-test-view",
"sdks/rust/tests/test-client",
"sdks/rust/tests/test-counter",
"sdks/rust/tests/connect_disconnect_client",
"sdks/rust/tests/procedure-client",
"sdks/rust/tests/view-client",
"tools/upgrade-version",
"tools/license-check",
"tools/replace-spacetimedb",
Expand Down
2 changes: 2 additions & 0 deletions modules/sdk-test-view/.cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[build]
target = "wasm32-unknown-unknown"
18 changes: 18 additions & 0 deletions modules/sdk-test-view/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[package]
name = "sdk-test-view"
version = "0.1.0"
edition.workspace = true
license-file = "LICENSE"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[lib]
crate-type = ["cdylib"]

[dependencies]
log.workspace = true
anyhow.workspace = true
paste.workspace = true

[dependencies.spacetimedb]
workspace = true
1 change: 1 addition & 0 deletions modules/sdk-test-view/LICENSE
14 changes: 14 additions & 0 deletions modules/sdk-test-view/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# `sdk-test-view` *Rust* test

This module tests that:
1. Rust client bindings are generated for views
2. You can register callbacks for views just like regular tables
3. Those callbacks are triggered when a view's dependencies are updated

## How to Run

Run tests named with `view` in the [Rust client SDK test suite](../../sdks/rust/tests/test.rs):

```sh
cargo test -p spacetimedb-sdk view
```
75 changes: 75 additions & 0 deletions modules/sdk-test-view/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
use spacetimedb::{
reducer, table, view, AnonymousViewContext, Identity, ReducerContext, SpacetimeType, Table, ViewContext,
};

#[table(name = player)]
struct Player {
#[primary_key]
#[auto_inc]
entity_id: u64,
#[unique]
identity: Identity,
}

#[table(name = player_level)]
struct PlayerLevel {
#[unique]
entity_id: u64,
#[index(btree)]
level: u64,
}

#[derive(SpacetimeType)]
struct PlayerAndLevel {
entity_id: u64,
identity: Identity,
level: u64,
}

#[reducer]
fn insert_player(ctx: &ReducerContext, identity: Identity, level: u64) {
let Player { entity_id, .. } = ctx.db.player().insert(Player { entity_id: 0, identity });
ctx.db.player_level().insert(PlayerLevel { entity_id, level });
}

#[reducer]
fn delete_player(ctx: &ReducerContext, identity: Identity) {
if let Some(player) = ctx.db.player().identity().find(identity) {
ctx.db.player().entity_id().delete(player.entity_id);
ctx.db.player_level().entity_id().delete(player.entity_id);
}
}

#[view(name = my_player, public)]
fn my_player(ctx: &ViewContext) -> Option<Player> {
ctx.db.player().identity().find(ctx.sender)
}

#[view(name = my_player_and_level, public)]
fn my_player_and_level(ctx: &ViewContext) -> Option<PlayerAndLevel> {
ctx.db
.player()
.identity()
.find(ctx.sender)
.and_then(|Player { entity_id, identity }| {
ctx.db
.player_level()
.entity_id()
.find(entity_id)
.map(|PlayerLevel { level, .. }| PlayerAndLevel {
entity_id,
identity,
level,
})
})
}

#[view(name = players_at_level_0, public)]
fn players_at_level_0(ctx: &AnonymousViewContext) -> Vec<Player> {
ctx.db
.player_level()
.level()
.filter(0u64)
.filter_map(|p| ctx.db.player().entity_id().find(p.entity_id))
.collect()
}
34 changes: 34 additions & 0 deletions sdks/rust/tests/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -329,3 +329,37 @@ macro_rules! procedure_tests {

procedure_tests!(rust_procedures, "");
procedure_tests!(typescript_procedures, "-ts");

mod view {
use spacetimedb_testing::sdk::Test;

const MODULE: &str = "sdk-test-view";
const CLIENT: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/view-client");

fn make_test(subcommand: &str) -> Test {
Test::builder()
.with_name(subcommand)
.with_module(MODULE)
.with_client(CLIENT)
.with_language("rust")
.with_bindings_dir("src/module_bindings")
.with_compile_command("cargo build")
.with_run_command(format!("cargo run -- {}", subcommand))
.build()
}

#[test]
fn subscribe_anonymous_view() {
make_test("view-anonymous-subscribe").run()
}

#[test]
fn subscribe_non_anonymous_view() {
make_test("view-non-anonymous-subscribe").run()
}

#[test]
fn subscribe_view_non_table_return() {
make_test("view-non-table-return").run()
}
}
17 changes: 17 additions & 0 deletions sdks/rust/tests/view-client/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[package]
name = "view-client"
version.workspace = true
edition.workspace = true
license-file = "LICENSE"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
spacetimedb-sdk = { path = "../.." }
spacetimedb-lib.workspace = true
test-counter = { path = "../test-counter" }
anyhow.workspace = true
env_logger.workspace = true

[lints]
workspace = true
1 change: 1 addition & 0 deletions sdks/rust/tests/view-client/LICENSE
13 changes: 13 additions & 0 deletions sdks/rust/tests/view-client/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
This test client is used with the module:

- [`sdk-test-view`](/modules/sdk-test-view)

The goal of the test is to exercise various view related
aspects of the (Rust) module ABI and the rust SDK.

To (re-)generate the `module_bindings`, from this directory, run:

```sh
mkdir -p src/module_bindings
spacetime generate --lang rust --out-dir src/module_bindings --project-path ../../../../modules/sdk-test-view
```
Loading
Loading