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