Skip to content

Commit 8187e7e

Browse files
committed
Updated tests, wip commit message
1 parent 734895e commit 8187e7e

File tree

7 files changed

+122
-63
lines changed

7 files changed

+122
-63
lines changed

PowerSync/PowerSync.Common/DB/Crud/CrudEntry.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,7 @@ public static CrudEntry FromRow(CrudEntryJSON dbRow)
8787
);
8888
}
8989

90-
public CrudEntryOutputJSON ToJSON()
91-
{
92-
return new CrudEntryOutputJSON
93-
{
94-
OpId = ClientId,
95-
Op = Op,
96-
Type = Table,
97-
Id = Id,
98-
TransactionId = TransactionId,
99-
Data = OpData
100-
};
101-
}
90+
10291

10392
public override bool Equals(object? obj)
10493
{

PowerSync/PowerSync.Common/DB/Schema/IndexedColumn.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class IndexedColumn(IndexColumnOptions options)
1717

1818
public object ToJSON(Table table)
1919
{
20-
var colType = table.OriginalColumns.TryGetValue(Name, out var value) ? value : default;
20+
var colType = table.Columns.TryGetValue(Name, out var value) ? value : default;
2121

2222
return JsonConvert.SerializeObject(
2323
new

PowerSync/PowerSync.Common/DB/Schema/Table.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ public class Table
2525
{
2626
protected TableOptions Options { get; set; }
2727

28-
public Dictionary<string, ColumnType> OriginalColumns;
28+
public Dictionary<string, ColumnType> Columns;
29+
public Dictionary<string, List<string>> Indexes;
2930

3031
private readonly List<Column> ConvertedColumns;
3132
private readonly List<Index> ConvertedIndexes;
@@ -47,7 +48,8 @@ [.. kv.Value.Select(name =>
4748

4849
Options = options ?? new TableOptions();
4950

50-
OriginalColumns = columns;
51+
Columns = columns;
52+
Indexes = Options?.Indexes ?? [];
5153
}
5254

5355
public string ToJSON(string Name = "")

Tests/PowerSync/PowerSync.Common.Tests/Client/PowerSyncDatabaseTransactionTests.cs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ public class PowerSyncDatabaseTransactionTests : IAsyncLifetime
77
{
88
private PowerSyncDatabase db = default!;
99

10-
1110
public async Task InitializeAsync()
1211
{
1312
db = new PowerSyncDatabase(new PowerSyncDatabaseOptions
1413
{
1514
Database = new SQLOpenOptions { DbFilename = "powersyncDataBaseTransactions.db" },
16-
Schema = TestData.appSchema,
15+
Schema = TestSchema.appSchema,
1716
});
1817
await db.Init();
1918
}
@@ -136,7 +135,7 @@ await db.WriteTransaction(async tx =>
136135
}
137136

138137
[Fact]
139-
public async Task ReadLockShouldBeReadOnlyTest()
138+
public async Task ReadLockReadOnlyTest()
140139
{
141140
string id = Guid.NewGuid().ToString();
142141
bool exceptionThrown = false;
@@ -164,7 +163,7 @@ await db.ReadLock<object>(async context =>
164163
}
165164

166165
[Fact]
167-
public async Task ReadLocksShouldQueueIfExceedNumberOfConnectionsTest()
166+
public async Task ReadLocksQueueIfExceedNumberOfConnectionsTest()
168167
{
169168
string id = Guid.NewGuid().ToString();
170169

@@ -189,7 +188,7 @@ await db.Execute(
189188
}
190189

191190
[Fact(Timeout = 2000)]
192-
public async Task ShouldBeAbleToReadWhileAWriteIsRunningTest()
191+
public async Task ReadWhileWriteIsRunningTest()
193192
{
194193
var tcs = new TaskCompletionSource();
195194

@@ -214,7 +213,7 @@ public async Task ShouldBeAbleToReadWhileAWriteIsRunningTest()
214213
}
215214

216215
[Fact(Timeout = 2000)]
217-
public async Task ShouldQueueSimultaneousExecutionsTest()
216+
public async Task QueueSimultaneousExecutionsTest()
218217
{
219218
var order = new List<int>();
220219
var operationCount = 5;
@@ -237,7 +236,7 @@ await db.WriteLock(async context =>
237236
}
238237

239238
[Fact(Timeout = 2000)]
240-
public async Task ShouldCallUpdateHookOnChangesTest()
239+
public async Task CallUpdateHookOnChangesTest()
241240
{
242241
var cts = new CancellationTokenSource();
243242
var result = new TaskCompletionSource();
@@ -261,7 +260,7 @@ public async Task ShouldCallUpdateHookOnChangesTest()
261260
}
262261

263262
[Fact(Timeout = 2000)]
264-
public async Task ShouldReflectWriteTransactionUpdatesOnReadConnectionsTest()
263+
public async Task ReflectWriteTransactionUpdatesOnReadConnectionsTest()
265264
{
266265
var watched = new TaskCompletionSource();
267266

@@ -291,9 +290,9 @@ await db.WriteTransaction(async tx =>
291290
}
292291

293292
[Fact(Timeout = 2000)]
294-
public async Task ShouldReflectWriteLockUpdatesOnReadConnectionsTest()
293+
public async Task ReflectWriteLockUpdatesOnReadConnectionsTest()
295294
{
296-
var numberOfUsers = 10_000;
295+
var numberOfAssets = 10_000;
297296

298297
var watched = new TaskCompletionSource();
299298

@@ -302,7 +301,7 @@ public async Task ShouldReflectWriteLockUpdatesOnReadConnectionsTest()
302301
{
303302
OnResult = (x) =>
304303
{
305-
if (x.First().count == numberOfUsers)
304+
if (x.First().count == numberOfAssets)
306305
{
307306
watched.SetResult();
308307
cts.Cancel();
@@ -316,7 +315,7 @@ public async Task ShouldReflectWriteLockUpdatesOnReadConnectionsTest()
316315
await db.WriteLock(async tx =>
317316
{
318317
await tx.Execute("BEGIN");
319-
for (var i = 0; i < numberOfUsers; i++)
318+
for (var i = 0; i < numberOfAssets; i++)
320319
{
321320
await tx.Execute("INSERT INTO assets (id) VALUES(?)", ["0" + i + "-writelock"]);
322321
}
@@ -327,7 +326,7 @@ await db.WriteLock(async tx =>
327326
}
328327

329328
[Fact(Timeout = 5000)]
330-
public async Task Insert10000Records_ShouldCompleteWithinTimeLimitTest()
329+
public async Task Insert10000Records_CompleteWithinTimeLimitTest()
331330
{
332331
var random = new Random();
333332
var stopwatch = Stopwatch.StartNew();
@@ -368,7 +367,7 @@ await db.WriteTransaction(async tx =>
368367

369368
// Try and read while the write transaction is still open
370369
var result = await db.GetAll<object>("SELECT * FROM assets");
371-
Assert.Single(result); // The transaction is not commited yet, we should only read 1 user
370+
Assert.Single(result); // The transaction is not commited yet, we should only read 1 asset
372371

373372
// Let the transaction complete
374373
tcs.SetResult(true);

Tests/PowerSync/PowerSync.Common.Tests/BucketStorageTests.cs renamed to Tests/PowerSync/PowerSync.Common.Tests/Client/Sync/BucketStorageTests.cs

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace PowerSync.Common.Tests;
1+
namespace PowerSync.Common.Tests.Client.Sync;
22

33
using System.Threading.Tasks;
44

@@ -58,35 +58,6 @@ class TestData
5858
ObjectId = "O1",
5959
Checksum = 5
6060
});
61-
62-
public static Table assets = new Table(new Dictionary<string, ColumnType>
63-
{
64-
{ "created_at", ColumnType.TEXT },
65-
{ "make", ColumnType.TEXT },
66-
{ "model", ColumnType.TEXT },
67-
{ "serial_number", ColumnType.TEXT },
68-
{ "quantity", ColumnType.INTEGER },
69-
{ "user_id", ColumnType.TEXT },
70-
{ "customer_id", ColumnType.TEXT },
71-
{ "description", ColumnType.TEXT },
72-
}, new TableOptions
73-
{
74-
Indexes = new Dictionary<string, List<string>> { { "makemodel", new List<string> { "make", "model" } } }
75-
});
76-
77-
public static Table customers = new Table(new Dictionary<string, ColumnType>
78-
{
79-
{ "name", ColumnType.TEXT },
80-
{ "email", ColumnType.TEXT }
81-
});
82-
83-
84-
public static Schema appSchema = new Schema(new Dictionary<string, Table>
85-
{
86-
{ "assets", assets },
87-
{ "customers", customers }
88-
});
89-
9061
}
9162

9263
public class BucketStorageTests : IAsyncLifetime
@@ -100,7 +71,7 @@ public async Task InitializeAsync()
10071
db = new PowerSyncDatabase(new PowerSyncDatabaseOptions
10172
{
10273
Database = new SQLOpenOptions { DbFilename = "powersync.db" },
103-
Schema = TestData.appSchema,
74+
Schema = TestSchema.appSchema,
10475
});
10576
await db.Init();
10677
bucketStorage = new SqliteBucketStorage(db.Database, createLogger());
@@ -526,7 +497,7 @@ await Assert.ThrowsAsync<SqliteException>(async () =>
526497
powersync = new PowerSyncDatabase(new PowerSyncDatabaseOptions
527498
{
528499
Database = new SQLOpenOptions { DbFilename = dbName },
529-
Schema = TestData.appSchema,
500+
Schema = TestSchema.appSchema,
530501
});
531502
await powersync.Init();
532503

@@ -545,7 +516,7 @@ public async Task ShouldRemoveTypes()
545516
var powersync = new PowerSyncDatabase(new PowerSyncDatabaseOptions
546517
{
547518
Database = new SQLOpenOptions { DbFilename = dbName },
548-
Schema = TestData.appSchema,
519+
Schema = TestSchema.appSchema,
549520
});
550521

551522
await powersync.Init();
@@ -587,7 +558,7 @@ await Assert.ThrowsAsync<SqliteException>(async () =>
587558
powersync = new PowerSyncDatabase(new PowerSyncDatabaseOptions
588559
{
589560
Database = new SQLOpenOptions { DbFilename = dbName },
590-
Schema = TestData.appSchema,
561+
Schema = TestSchema.appSchema,
591562
});
592563
await powersync.Init();
593564

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
namespace PowerSync.Common.Tests.Client;
2+
3+
using System.Diagnostics;
4+
using Newtonsoft.Json;
5+
using PowerSync.Common.Client;
6+
using PowerSync.Common.Client.Sync.Bucket;
7+
using PowerSync.Common.DB.Crud;
8+
9+
public class CRUDTests : IAsyncLifetime
10+
{
11+
private PowerSyncDatabase db = default!;
12+
13+
public async Task InitializeAsync()
14+
{
15+
db = new PowerSyncDatabase(new PowerSyncDatabaseOptions
16+
{
17+
Database = new SQLOpenOptions { DbFilename = "crudtest12xas.db" },
18+
Schema = TestSchema.appSchema,
19+
});
20+
await db.Init();
21+
}
22+
23+
public async Task DisposeAsync()
24+
{
25+
await db.DisconnectAndClear();
26+
await db.Close();
27+
}
28+
29+
[Fact]
30+
public async Task Insert_ShouldRecordCrudEntry()
31+
{
32+
string testId = Guid.NewGuid().ToString();
33+
34+
var initialRows = await db.GetAll<object>("SELECT * FROM ps_crud");
35+
Assert.Empty(initialRows);
36+
37+
await db.Execute("INSERT INTO assets(id, description) VALUES(?, ?)", [testId, "test"]);
38+
var crudEntry = await db.Get<CrudEntryJSON>("SELECT data FROM ps_crud ORDER BY id");
39+
40+
Assert.Equal(
41+
JsonConvert.SerializeObject(new
42+
{
43+
op = "PUT",
44+
type = "assets",
45+
id = testId,
46+
data = new { description = "test" }
47+
}),
48+
crudEntry.Data
49+
);
50+
51+
var tx = await db.GetNextCrudTransaction();
52+
Assert.Equal(1, tx!.TransactionId);
53+
54+
var expectedCrudEntry = new CrudEntry(1, UpdateType.PUT, "assets", testId, 1, new Dictionary<string, object>
55+
{
56+
{ "description", "test" }
57+
});
58+
59+
Assert.True(tx.Crud.First().Equals(expectedCrudEntry));
60+
}
61+
62+
63+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using PowerSync.Common.DB.Schema;
2+
3+
namespace PowerSync.Common.Tests;
4+
5+
6+
public class TestSchema
7+
{
8+
public static Table assets = new Table(new Dictionary<string, ColumnType>
9+
{
10+
{ "created_at", ColumnType.TEXT },
11+
{ "make", ColumnType.TEXT },
12+
{ "model", ColumnType.TEXT },
13+
{ "serial_number", ColumnType.TEXT },
14+
{ "quantity", ColumnType.INTEGER },
15+
{ "user_id", ColumnType.TEXT },
16+
{ "customer_id", ColumnType.TEXT },
17+
{ "description", ColumnType.TEXT },
18+
}, new TableOptions
19+
{
20+
Indexes = new Dictionary<string, List<string>> { { "makemodel", new List<string> { "make", "model" } } }
21+
});
22+
23+
public static Table customers = new Table(new Dictionary<string, ColumnType>
24+
{
25+
{ "name", ColumnType.TEXT },
26+
{ "email", ColumnType.TEXT }
27+
});
28+
29+
30+
public static Schema appSchema = new Schema(new Dictionary<string, Table>
31+
{
32+
{ "assets", assets },
33+
{ "customers", customers }
34+
});
35+
}

0 commit comments

Comments
 (0)