Skip to content

Commit 442d155

Browse files
committed
Add check for localonly to synced switching
1 parent c50a82b commit 442d155

1 file changed

Lines changed: 46 additions & 2 deletions

File tree

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

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ namespace PowerSync.Common.Tests.Client;
33
using System.Diagnostics;
44

55
using Microsoft.Data.Sqlite;
6-
6+
using Newtonsoft.Json;
77
using PowerSync.Common.Client;
88
using PowerSync.Common.DB.Schema;
99

@@ -700,6 +700,7 @@ public async Task WatchSchemaResetTest()
700700
{
701701
Name = "assets_local",
702702
ViewName = "assets",
703+
LocalOnly = true,
703704
Columns =
704705
{
705706
["make"] = ColumnType.Text,
@@ -711,6 +712,7 @@ public async Task WatchSchemaResetTest()
711712
{
712713
Name = "assets_synced",
713714
ViewName = "assets_synced_inactive",
715+
LocalOnly = false,
714716
Columns =
715717
{
716718
["make"] = ColumnType.Text,
@@ -724,6 +726,7 @@ public async Task WatchSchemaResetTest()
724726
{
725727
Name = "assets_local",
726728
ViewName = "assets_local_inactive",
729+
LocalOnly = true,
727730
Columns =
728731
{
729732
["make"] = ColumnType.Text,
@@ -734,6 +737,7 @@ public async Task WatchSchemaResetTest()
734737
{
735738
Name = "assets_synced",
736739
ViewName = "assets",
740+
LocalOnly = false,
737741
Columns =
738742
{
739743
["make"] = ColumnType.Text,
@@ -755,7 +759,8 @@ public async Task WatchSchemaResetTest()
755759
var sem = new SemaphoreSlim(0);
756760
long lastCount = -1;
757761

758-
var query = await db.Watch("SELECT COUNT(*) AS count FROM assets", [], new WatchHandler<CountResult>
762+
string querySql = "SELECT COUNT(*) AS count FROM assets";
763+
var query = await db.Watch(querySql, [], new WatchHandler<CountResult>
759764
{
760765
OnResult = (result) =>
761766
{
@@ -767,6 +772,10 @@ public async Task WatchSchemaResetTest()
767772
Assert.True(await sem.WaitAsync(100));
768773
Assert.Equal(0, lastCount);
769774

775+
var initialResolved = await GetSourceTables(db, querySql);
776+
Assert.Contains("ps_data_local__assets_local", initialResolved);
777+
Assert.DoesNotContain("ps_data__assets_synced", initialResolved);
778+
770779
for (int i = 0; i < 3; i++)
771780
{
772781
await db.Execute(
@@ -779,6 +788,11 @@ await db.Execute(
779788
Assert.Equal(3, lastCount);
780789

781790
await db.UpdateSchema(updatedSchema);
791+
792+
var updatedResolved = await GetSourceTables(db, querySql);
793+
Assert.Contains("ps_data__assets_synced", updatedResolved);
794+
Assert.DoesNotContain("ps_data_local__assets_local", updatedResolved);
795+
782796
Assert.True(await sem.WaitAsync(100));
783797
Assert.Equal(0, lastCount);
784798

@@ -792,4 +806,34 @@ await db.Execute(
792806
Assert.False(await sem.WaitAsync(100));
793807
Assert.Equal(3, lastCount);
794808
}
809+
810+
private class ExplainedResult
811+
{
812+
public int addr = 0;
813+
public string opcode = "";
814+
public int p1 = 0;
815+
public int p2 = 0;
816+
public int p3 = 0;
817+
public string p4 = "";
818+
public int p5 = 0;
819+
}
820+
private record TableSelectResult(string tbl_name);
821+
private async Task<List<string>> GetSourceTables(PowerSyncDatabase db, string sql, object?[]? parameters = null)
822+
{
823+
var explained = await db.GetAll<ExplainedResult>(
824+
$"EXPLAIN {sql}", parameters
825+
);
826+
827+
var rootPages = explained
828+
.Where(row => row.opcode == "OpenRead" && row.p3 == 0)
829+
.Select(row => row.p2)
830+
.ToList();
831+
832+
var tables = await db.GetAll<TableSelectResult>(
833+
"SELECT DISTINCT tbl_name FROM sqlite_master WHERE rootpage IN (SELECT json_each.value FROM json_each(?))",
834+
[JsonConvert.SerializeObject(rootPages)]
835+
);
836+
837+
return tables.Select(row => row.tbl_name).ToList();
838+
}
795839
}

0 commit comments

Comments
 (0)