Skip to content

Commit 29f3ae3

Browse files
committed
Lower test warnings, better testing semantics, more test utils
1 parent 043806f commit 29f3ae3

4 files changed

Lines changed: 69 additions & 78 deletions

File tree

Tests/PowerSync/PowerSync.Common.Tests/Client/PowerSyncDatabaseTests.cs

Lines changed: 35 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -47,49 +47,51 @@ private record CountResult(long count);
4747

4848
private class AssetResult
4949
{
50-
public string id { get; set; }
51-
public string description { get; set; }
50+
public string id { get; set; } = "";
51+
public string description { get; set; } = "";
5252
public string? make { get; set; }
5353
}
5454

5555
[Fact]
5656
public async Task QueryWithoutParams()
5757
{
58-
var name = "Test User";
59-
var age = 30;
58+
var id = Guid.NewGuid().ToString();
59+
var description = "some desc";
60+
var make = "some make";
6061

6162
await db.Execute(
6263
"INSERT INTO assets(id, description, make) VALUES(?, ?, ?)",
63-
[Guid.NewGuid().ToString(), name, age.ToString()]
64+
[id, description, make]
6465
);
6566

6667
var result = await db.GetAll<AssetResult>("SELECT id, description, make FROM assets");
6768

6869
Assert.Single(result);
6970
var row = result.First();
70-
Assert.Equal(name, row.description);
71-
Assert.Equal(age.ToString(), row.make);
71+
Assert.Equal(id, row.id);
72+
Assert.Equal(description, row.description);
73+
Assert.Equal(make, row.make);
7274
}
7375

7476
[Fact]
7577
public async Task QueryWithParams()
7678
{
7779
var id = Guid.NewGuid().ToString();
78-
var name = "Test User";
79-
var age = 30;
80+
var description = "some desc";
81+
var make = "some make";
8082

8183
await db.Execute(
8284
"INSERT INTO assets(id, description, make) VALUES(?, ?, ?)",
83-
[id, name, age.ToString()]
85+
[id, description, make]
8486
);
8587

8688
var result = await db.GetAll<AssetResult>("SELECT id, description, make FROM assets WHERE id = ?", [id]);
8789

8890
Assert.Single(result);
8991
var row = result.First();
9092
Assert.Equal(id, row.id);
91-
Assert.Equal(name, row.description);
92-
Assert.Equal(age.ToString(), row.make);
93+
Assert.Equal(description, row.description);
94+
Assert.Equal(make, row.make);
9395
}
9496

9597
[Fact]
@@ -113,26 +115,26 @@ await db.Execute(
113115
}
114116

115117
[Fact]
116-
public async Task QueriesRunOnAnotherThread()
118+
public async Task QueriesDoNotBlockCaller()
117119
{
118-
int preCallThreadId = Environment.CurrentManagedThreadId;
119-
await db.GetAll("select * from assets");
120-
int postCallThreadId = Environment.CurrentManagedThreadId;
120+
var writeTask = db.WriteLock(async ctx =>
121+
{
122+
// Simulate slow query
123+
await Task.Delay(200);
124+
});
121125

122-
Assert.NotEqual(preCallThreadId, postCallThreadId);
126+
Assert.False(writeTask.IsCompleted, "Write task with 200ms delay completed synchronously instead of yielding");
127+
await writeTask;
123128
}
124129

125130
[Fact]
126131
public async Task FailedInsert()
127132
{
128-
var name = "Test User";
129-
var age = 30;
130-
131133
var exception = await Assert.ThrowsAsync<SqliteException>(async () =>
132134
{
133135
await db.Execute(
134136
"INSERT INTO assetsfail (id, description, make) VALUES(?, ?, ?)",
135-
[Guid.NewGuid().ToString(), name, age.ToString()]
137+
[Guid.NewGuid().ToString(), "some desc", "some make"]
136138
);
137139
});
138140

@@ -598,20 +600,14 @@ public async Task Watch_Cancelled()
598600
Assert.True(await sem.WaitAsync(100));
599601
Assert.Equal(1, callCount);
600602

601-
await db.Execute(
602-
"insert into assets(id, description, make) values (?, ?, ?)",
603-
[Guid.NewGuid().ToString(), "some desc", "some make"]
604-
);
603+
await TestUtils.InsertRandomAsset(db);
605604

606605
Assert.True(await sem.WaitAsync(100));
607606
Assert.Equal(2, callCount);
608607

609608
testCts.Cancel();
610609

611-
await db.Execute(
612-
"insert into assets(id, description, make) values (?, ?, ?)",
613-
[Guid.NewGuid().ToString(), "some desc", "some make"]
614-
);
610+
await TestUtils.InsertRandomAsset(db);
615611

616612
// This is failing
617613
Assert.False(await sem.WaitAsync(100));
@@ -644,20 +640,14 @@ void RunQuery(CancellationTokenSource cts, SemaphoreSlim sem)
644640
RunQuery(ctsAlwaysRunning, semAlwaysRunning);
645641
RunQuery(ctsCancelled, semCancelled);
646642

647-
await db.Execute(
648-
"insert into assets(id, description, make) values (?, ?, ?)",
649-
[Guid.NewGuid().ToString(), "some desc", "some make"]
650-
);
643+
await TestUtils.InsertRandomAsset(db);
651644
await Task.WhenAll(semAlwaysRunning.WaitAsync(), semCancelled.WaitAsync());
652645
Assert.Equal(2, callCount);
653646

654647
// Close one query
655648
ctsCancelled.Cancel();
656649

657-
await db.Execute(
658-
"insert into assets(id, description, make) values (?, ?, ?)",
659-
[Guid.NewGuid().ToString(), "some desc", "some make"]
660-
);
650+
await TestUtils.InsertRandomAsset(db);
661651

662652
// Ensure nothing received from cancelled result
663653
Assert.False(await semCancelled.WaitAsync(100));
@@ -668,10 +658,7 @@ await db.Execute(
668658
// Sanity check
669659
ctsAlwaysRunning.Cancel();
670660

671-
await db.Execute(
672-
"insert into assets(id, description, make) values (?, ?, ?)",
673-
[Guid.NewGuid().ToString(), "some desc", "some make"]
674-
);
661+
await TestUtils.InsertRandomAsset(db);
675662

676663
Assert.False(await semAlwaysRunning.WaitAsync(100));
677664
Assert.False(await semCancelled.WaitAsync(100));
@@ -718,10 +705,7 @@ public async Task Watch_SchemaReset()
718705

719706
for (int i = 0; i < 3; i++)
720707
{
721-
await db.Execute(
722-
"insert into assets(id, description, make) values (?, ?, ?)",
723-
[Guid.NewGuid().ToString(), "some desc", "some make"]
724-
);
708+
await TestUtils.InsertRandomAsset(db);
725709
Assert.True(await sem.WaitAsync(100));
726710
Assert.Equal(i + 1, lastCount);
727711
}
@@ -774,7 +758,7 @@ public async Task Attributes_ColumnAliasing()
774758
var createdAt = DateTimeOffset.Now;
775759

776760
await db.Execute(
777-
"INSERT INTO todos(id, description, completed, created_at, list_id) VALUES(?, ?, ?, ?, uuid())",
761+
"INSERT INTO todos (id, description, completed, created_at) VALUES (?, ?, ?, ?)",
778762
[id, description, completed, createdAt]
779763
);
780764

@@ -811,14 +795,7 @@ public async Task IndexesCreatedOnTable()
811795
public async Task Watch_TriggerImmediately_True()
812796
{
813797
// Insert some data
814-
await db.ExecuteBatch(
815-
"insert into assets(id, description, make) values (?, ?, ?)",
816-
[
817-
[Guid.NewGuid().ToString(), "some desc", "some make"],
818-
[Guid.NewGuid().ToString(), "some desc", "some make"],
819-
[Guid.NewGuid().ToString(), "some desc", "some make"],
820-
]
821-
);
798+
await TestUtils.InsertRandomAssets(db, 3);
822799

823800
var listener = db.Watch<CountResult>(
824801
"SELECT COUNT(*) AS count FROM assets",
@@ -851,14 +828,7 @@ public async Task Watch_TriggerImmediately_False()
851828
Assert.Equal(timeout, await Task.WhenAny(moveNext, timeout));
852829

853830
// Trigger the watch to run
854-
await db.ExecuteBatch(
855-
"insert into assets(id, description, make) values (?, ?, ?)",
856-
[
857-
[Guid.NewGuid().ToString(), "some desc", "some make"],
858-
[Guid.NewGuid().ToString(), "some desc", "some make"],
859-
[Guid.NewGuid().ToString(), "some desc", "some make"],
860-
]
861-
);
831+
await TestUtils.InsertRandomAssets(db, 3);
862832

863833
timeout = Task.Delay(500);
864834
Assert.NotEqual(timeout, await Task.WhenAny(moveNext, timeout));
@@ -880,21 +850,15 @@ public async Task Watch_CancelsOnTokenCancellation()
880850
null,
881851
new() { Signal = cts.Token, TriggerImmediately = false });
882852

853+
// Sem == received result
854+
// TCS == received cancellation
883855
_ = Task.Run(async () =>
884856
{
885857
await foreach (var _ in listener) { sem.Release(); }
886858
tcs.TrySetResult(true);
887859
});
888860

889-
await db.ExecuteBatch(
890-
"insert into assets(id, description, make) values (?, ?, ?)",
891-
[
892-
[Guid.NewGuid().ToString(), "some desc", "some make"],
893-
[Guid.NewGuid().ToString(), "some desc", "some make"],
894-
[Guid.NewGuid().ToString(), "some desc", "some make"],
895-
]
896-
);
897-
861+
await TestUtils.InsertRandomAssets(db, 3);
898862
Assert.True(await sem.WaitAsync(200));
899863

900864
cts.Cancel();

Tests/PowerSync/PowerSync.Common.Tests/Models/List.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ namespace PowerSync.Common.Tests.Models;
77
public class List
88
{
99
[Column("id")]
10-
public string ListId { get; set; }
10+
public string ListId { get; set; } = "";
1111

1212
[Column("created_at")]
1313
public DateTime CreatedAt { get; set; }
1414

1515
[Column("name")]
16-
public string Name { get; set; }
16+
public string Name { get; set; } = "";
1717

1818
[Column("owner_id")]
19-
public string OwnerId { get; set; }
19+
public string OwnerId { get; set; } = "";
2020
}

Tests/PowerSync/PowerSync.Common.Tests/Models/Todo.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ namespace PowerSync.Common.Tests.Models;
1010
public class Todo
1111
{
1212
[Column("id")]
13-
public string TodoId { get; set; }
13+
public string TodoId { get; set; } = "";
1414

1515
[Column("list_id")]
16-
public string ListId { get; set; }
16+
public string ListId { get; set; } = "";
1717

1818
[Column("created_at")]
1919
public DateTime CreatedAt { get; set; }
@@ -22,10 +22,10 @@ public class Todo
2222
public DateTime? CompletedAt { get; set; }
2323

2424
[Column("description")]
25-
public string Description { get; set; }
25+
public string Description { get; set; } = "";
2626

2727
[Column("created_by")]
28-
public string CreatedBy { get; set; }
28+
public string CreatedBy { get; set; } = "";
2929

3030
[Column("completed_by")]
3131
public string? CompletedBy { get; set; }

Tests/PowerSync/PowerSync.Common.Tests/Utils/TestUtils.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Runtime.CompilerServices;
2+
using PowerSync.Common.Client;
23

34
namespace PowerSync.Common.Tests.Utils;
45

@@ -44,4 +45,30 @@ public static async Task WaitForAsync(Func<Task<bool>> condition, TimeSpan? time
4445
}
4546
throw new TimeoutException("Condition not met within timeout");
4647
}
48+
49+
public static async Task<string> InsertRandomAsset(PowerSyncDatabase db)
50+
{
51+
var id = Guid.NewGuid().ToString();
52+
await db.Execute(
53+
"insert into assets(id, description, make) values (?, ?, ?)",
54+
[id, "some desc", "some make"]
55+
);
56+
return id;
57+
}
58+
59+
public static async Task<string[]> InsertRandomAssets(PowerSyncDatabase db, int assetCount)
60+
{
61+
var ids = Enumerable
62+
.Range(0, assetCount)
63+
.Select(_ => Guid.NewGuid().ToString())
64+
.ToArray();
65+
var parameters = ids
66+
.Select<string, object?[]>(id => [id, "some desc", "some make"])
67+
.ToArray();
68+
await db.ExecuteBatch(
69+
"insert into assets(id, description, make) values (?, ?, ?)",
70+
parameters
71+
);
72+
return ids;
73+
}
4774
}

0 commit comments

Comments
 (0)