Skip to content

Commit 8ce6f15

Browse files
rust client view test
1 parent 988e13b commit 8ce6f15

10 files changed

Lines changed: 485 additions & 111 deletions

File tree

modules/sdk-test-cs/Lib.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2060,10 +2060,24 @@ public static void insert_user(ReducerContext ctx, string name, Identity identit
20602060
ctx.Db.users.Insert(new Users { name = name, identity = identity });
20612061
}
20622062

2063-
[SpacetimeDB.View(Name = "my_user", Public = true)]
2064-
public static Users? MyUser(ViewContext ctx)
2063+
[SpacetimeDB.Table(Name = "player")]
2064+
public partial struct Player
20652065
{
2066-
return ctx.Db.users.identity.Find(ctx.Sender) as Users;
2066+
[PrimaryKey]
2067+
public Identity identity;
2068+
public string name;
2069+
}
2070+
2071+
[SpacetimeDB.Reducer]
2072+
public static void insert_player(ReducerContext ctx, string name, Identity identity)
2073+
{
2074+
ctx.Db.player.Insert(new Player { name = name, identity = identity });
2075+
}
2076+
2077+
[SpacetimeDB.View(Name = "my_player", Public = true)]
2078+
public static Player? MyPlayer(ViewContext ctx)
2079+
{
2080+
return (Player?)ctx.Db.player.identity.Find(ctx.Sender);
20672081
}
20682082

20692083
[SpacetimeDB.Table(Name = "indexed_simple_enum", Public = true)]

modules/sdk-test/src/lib.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -796,9 +796,22 @@ fn insert_user(ctx: &ReducerContext, name: String, identity: Identity) -> anyhow
796796
Ok(())
797797
}
798798

799-
#[spacetimedb::view(name = my_user, public)]
800-
fn my_user(ctx: &ViewContext) -> Option<Users> {
801-
ctx.db.users().identity().find(ctx.sender)
799+
#[spacetimedb::table(name = player)]
800+
struct Player {
801+
#[primary_key]
802+
identity: Identity,
803+
name: String,
804+
}
805+
806+
#[spacetimedb::reducer]
807+
fn insert_player(ctx: &ReducerContext, name: String, identity: Identity) -> anyhow::Result<()> {
808+
ctx.db.player().insert(Player { name, identity });
809+
Ok(())
810+
}
811+
812+
#[spacetimedb::view(name = my_player, public)]
813+
fn my_player(ctx: &ViewContext) -> Option<Player> {
814+
ctx.db.player().identity().find(ctx.sender)
802815
}
803816

804817
#[spacetimedb::table(name = indexed_simple_enum, public)]

sdks/rust/tests/test-client/src/main.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ fn main() {
129129
"two-different-compression-algos" => exec_two_different_compression_algos(),
130130
"test-parameterized-subscription" => test_parameterized_subscription(),
131131
"test-rls-subscription" => test_rls_subscription(),
132+
"test-client-specific-view" => test_client_specific_view(),
132133
"pk-simple-enum" => exec_pk_simple_enum(),
133134
"indexed-simple-enum" => exec_indexed_simple_enum(),
134135

@@ -2471,6 +2472,59 @@ fn test_rls_subscription() {
24712472
ctr_for_test.wait_for_all();
24722473
}
24732474

2475+
/// The same test as [`test_rls_subscription`], but with views instead of rls
2476+
fn test_client_specific_view() {
2477+
let ctr_for_test = TestCounter::new();
2478+
let ctr_for_subs = TestCounter::new();
2479+
let sub_0 = Some(ctr_for_subs.add_test("sub_0"));
2480+
let sub_1 = Some(ctr_for_subs.add_test("sub_1"));
2481+
let ins_0 = Some(ctr_for_test.add_test("insert_0"));
2482+
let ins_1 = Some(ctr_for_test.add_test("insert_1"));
2483+
2484+
fn subscribe_and_update(
2485+
test_name: &str,
2486+
user_name: &str,
2487+
waiters: [Arc<TestCounter>; 2],
2488+
senders: [Option<ResultRecorder>; 2],
2489+
) {
2490+
let [ctr_for_test, ctr_for_subs] = waiters;
2491+
let [mut record_sub, mut record_ins] = senders;
2492+
let user_name = user_name.to_owned();
2493+
let expected_name = user_name.to_owned();
2494+
connect_with_then(&ctr_for_test, test_name, |builder| builder, {
2495+
move |ctx| {
2496+
let sender = ctx.identity();
2497+
let expected_identity = sender;
2498+
subscribe_these_then(ctx, &["SELECT * FROM my_player"], move |ctx| {
2499+
put_result(&mut record_sub, Ok(()));
2500+
// Wait to insert until both client connections have been made
2501+
ctr_for_subs.wait_for_all();
2502+
ctx.reducers.insert_player(user_name, sender).unwrap();
2503+
});
2504+
ctx.db.my_player().on_insert(move |_, player| {
2505+
assert_eq!(player.name, expected_name);
2506+
assert_eq!(player.identity, expected_identity);
2507+
put_result(&mut record_ins, Ok(()));
2508+
});
2509+
}
2510+
});
2511+
}
2512+
2513+
subscribe_and_update(
2514+
"client_0",
2515+
"Alice",
2516+
[ctr_for_test.clone(), ctr_for_subs.clone()],
2517+
[sub_0, ins_0],
2518+
);
2519+
subscribe_and_update(
2520+
"client_1",
2521+
"Bob",
2522+
[ctr_for_test.clone(), ctr_for_subs.clone()],
2523+
[sub_1, ins_1],
2524+
);
2525+
ctr_for_test.wait_for_all();
2526+
}
2527+
24742528
fn exec_pk_simple_enum() {
24752529
let test_counter: Arc<TestCounter> = TestCounter::new();
24762530
let mut updated = Some(test_counter.add_test("updated"));

sdks/rust/tests/test-client/src/module_bindings/insert_player_reducer.rs

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

0 commit comments

Comments
 (0)