Skip to content

Commit 8ff2731

Browse files
Merge branch 'main' into chore/deploy-to-maven-central
2 parents 7507194 + 836534a commit 8ff2731

File tree

5 files changed

+161
-17
lines changed

5 files changed

+161
-17
lines changed

.github/workflows/gradle.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ jobs:
4040
- name: Set up Gradle
4141
uses: gradle/actions/setup-gradle@v3
4242

43-
- name: Build with Gradle
43+
- name: Build and run tests with Gradle
4444
run: |
4545
./gradlew \
4646
${{ matrix.target }} \
47-
-PGITHUB_PUBLISH_TOKEN=${{ secrets.GITHUB_TOKEN }}
47+
-PGITHUB_PUBLISH_TOKEN=${{ secrets.GITHUB_TOKEN }}

core/src/commonMain/kotlin/com/powersync/db/schema/Table.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ package com.powersync.db.schema
22

33
import kotlinx.serialization.Serializable
44

5+
private const val MAX_AMOUNT_OF_COLUMNS = 63
6+
57
/**
68
* A single table in the schema.
79
*/
810
@Serializable
9-
1011
public data class Table constructor(
1112
/**
1213
* The synced table name, matching sync rules.
@@ -115,9 +116,15 @@ public data class Table constructor(
115116
* Check that there are no issues in the table definition.
116117
*/
117118
public fun validate() {
119+
if (columns.size > MAX_AMOUNT_OF_COLUMNS) {
120+
throw AssertionError("Table $name has more than $MAX_AMOUNT_OF_COLUMNS columns, which is not supported")
121+
}
122+
118123
if (invalidSqliteCharacters.containsMatchIn(name)) {
119124
throw AssertionError("Invalid characters in table name: $name")
120-
} else if (_viewNameOverride != null && invalidSqliteCharacters.containsMatchIn(
125+
}
126+
127+
if (_viewNameOverride != null && invalidSqliteCharacters.containsMatchIn(
121128
_viewNameOverride
122129
)
123130
) {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package com.powersync.db.schema
22

3-
internal val invalidSqliteCharacters = Regex("""["'%,.#\\s\\[\\]]""")
3+
internal val invalidSqliteCharacters = Regex("""["'%,.#\s\[\]]""")

core/src/commonTest/kotlin/com/powersync/FoobarTest.kt

Lines changed: 0 additions & 12 deletions
This file was deleted.
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package com.powersync.db.schema
2+
3+
import kotlin.test.*
4+
5+
class TableTest {
6+
7+
@Test
8+
fun testTableInitialization() {
9+
val columns = listOf(
10+
Column("name", ColumnType.TEXT),
11+
Column("age", ColumnType.INTEGER)
12+
)
13+
val table = Table("users", columns)
14+
15+
assertEquals("users", table.name)
16+
assertEquals(2, table.columns.size)
17+
assertEquals("ps_data__users", table.internalName)
18+
}
19+
20+
@Test
21+
fun testLocalOnlyTable() {
22+
val columns = listOf(Column("content", ColumnType.TEXT))
23+
val table = Table.localOnly("notes", columns)
24+
25+
assertTrue(table.internalName.startsWith("ps_data_local__"))
26+
assertEquals("notes", table.viewName)
27+
}
28+
29+
@Test
30+
fun testInsertOnlyTable() {
31+
val columns = listOf(Column("event", ColumnType.TEXT))
32+
val table = Table.insertOnly("logs", columns)
33+
34+
assertTrue(table.internalName.startsWith("ps_data__"))
35+
assertEquals("logs", table.viewName)
36+
}
37+
38+
@Test
39+
fun testColumnRetrieval() {
40+
val columns = listOf(
41+
Column("name", ColumnType.TEXT),
42+
Column("age", ColumnType.INTEGER)
43+
)
44+
val table = Table("users", columns)
45+
46+
assertEquals(ColumnType.TEXT, table["name"].type)
47+
assertEquals(ColumnType.INTEGER, table["age"].type)
48+
}
49+
50+
@Test
51+
fun testValidTableName() {
52+
val columns = listOf(Column("name", ColumnType.TEXT))
53+
val table = Table("valid_table_name", columns)
54+
55+
assertTrue(table.validName)
56+
}
57+
58+
@Test
59+
fun testInvalidTableName() {
60+
val columns = listOf(Column("name", ColumnType.TEXT))
61+
val table = Table("#invalid-table-name", columns)
62+
63+
assertFalse(table.validName)
64+
}
65+
66+
@Test
67+
fun testValidation() {
68+
val columns = listOf(
69+
Column("name", ColumnType.TEXT),
70+
Column("age", ColumnType.INTEGER)
71+
)
72+
val table = Table("users", columns)
73+
74+
// This should not throw an exception
75+
table.validate()
76+
}
77+
78+
@Test
79+
fun testValidationFailsDuplicateColumn() {
80+
val columns = listOf(
81+
Column("name", ColumnType.TEXT),
82+
Column("name", ColumnType.TEXT)
83+
)
84+
val table = Table("users", columns)
85+
86+
val exception = assertFailsWith<AssertionError> {
87+
table.validate()
88+
}
89+
assertEquals(exception.message, "Duplicate column users.name")
90+
}
91+
92+
@Test
93+
fun testValidationFailsInvalidColumnName() {
94+
val columns = listOf(Column("#invalid-name", ColumnType.TEXT))
95+
val table = Table("users", columns)
96+
97+
val exception = assertFailsWith<AssertionError> {
98+
table.validate()
99+
}
100+
assertEquals(exception.message, "Invalid characters in column name: users.#invalid-name")
101+
}
102+
103+
@Test
104+
fun testValidationFailsTooManyColumns() {
105+
val columns = List(64) { Column("column$it", ColumnType.TEXT) }
106+
val table = Table("users", columns)
107+
108+
val exception = assertFailsWith<AssertionError> {
109+
table.validate()
110+
}
111+
assertEquals(exception.message,"Table users has more than 63 columns, which is not supported")
112+
}
113+
114+
@Test
115+
fun testValidationFailsInvalidIndexColumnReference() {
116+
val columns = listOf(Column("name", ColumnType.TEXT))
117+
val indexes = listOf(Index("idx_age", listOf(IndexedColumn("age"))))
118+
119+
val exception = assertFailsWith<AssertionError> {
120+
Table("users", columns, indexes)
121+
}
122+
assertEquals(exception.message, "Could not find column definition for index idx_age:age")
123+
}
124+
125+
@Test
126+
fun testValidationInvalidIndexColumnName() {
127+
val columns = listOf(Column("name", ColumnType.TEXT))
128+
val indexes = listOf(Index("#name_index", listOf(IndexedColumn("name"))))
129+
val table = Table("users", columns, indexes)
130+
131+
val exception = assertFailsWith<AssertionError> {
132+
table.validate()
133+
}
134+
assertEquals(exception.message,"Invalid characters in index name: users.#name_index")
135+
}
136+
137+
@Test
138+
fun testValidationFailsDuplicateIndexColumn() {
139+
val columns = listOf(Column("name", ColumnType.TEXT))
140+
val indexes = listOf(Index("name_index", listOf(IndexedColumn("name"))), Index("name_index", listOf(IndexedColumn("name"))))
141+
val table = Table("users", columns, indexes)
142+
143+
val exception = assertFailsWith<AssertionError> {
144+
table.validate()
145+
}
146+
147+
assertEquals(exception.message,"Duplicate index users.name_index")
148+
}
149+
}

0 commit comments

Comments
 (0)