Skip to content

Commit 6e5052a

Browse files
committed
Add behaviour-finding tests and update README to reflect findings
1 parent 6391d13 commit 6e5052a

File tree

5 files changed

+109
-17
lines changed

5 files changed

+109
-17
lines changed

Libsql.Client.Tests/ExecuteTests.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public async Task RowsAffected_ReturnsExpectedValue()
3939
[Fact]
4040
public async Task RowsAffected_ReturnsExectedValue_WhenMultipleUpdates()
4141
{
42-
await _db.Query("CREATE TABLE `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `value` INTEGER)");
42+
await _db.Execute("CREATE TABLE `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `value` INTEGER)");
4343

4444
for (int i = 0; i < 10; i++)
4545
{
@@ -50,4 +50,15 @@ public async Task RowsAffected_ReturnsExectedValue_WhenMultipleUpdates()
5050

5151
Assert.Equal(10ul, rs2.RowsAffected);
5252
}
53+
54+
[Fact]
55+
public async Task Throws_WhenRowsReturned()
56+
{
57+
async Task action()
58+
{
59+
await _db.Execute("SELECT 1");
60+
}
61+
62+
await Assert.ThrowsAsync<LibsqlException>(action);
63+
}
5364
}

Libsql.Client.Tests/ResultSetTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ public async Task Columns_NamesAreMarshalled_WhenSeveral()
4343
Assert.Equal("column_two", columns.Last());
4444
}
4545

46+
[Fact]
47+
public async Task LastInsertRowId_Zero_WhenNonQuery()
48+
{
49+
var rs = await _db.Query("CREATE TABLE `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT)");
50+
51+
Assert.Equal(0, rs.LastInsertRowId);
52+
}
53+
4654
[Fact]
4755
public async Task LastInsertRowId_ReturnsExpectedValue()
4856
{
@@ -66,6 +74,14 @@ public async Task LastInsertRowId_ReturnsExpectedValue_WhenMultipleInserts()
6674
}
6775
}
6876

77+
[Fact]
78+
public async Task RowsAffected_Zero_WhenNonQuery()
79+
{
80+
var rs = await _db.Query("CREATE TABLE `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT)");
81+
82+
Assert.Equal(0ul, rs.RowsAffected);
83+
}
84+
6985
[Fact]
7086
public async Task RowsAffected_ReturnsExpectedValue()
7187
{

Libsql.Client.Tests/RowsTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,48 @@
33
public class RowsTests
44
{
55
private readonly IDatabaseClient _db = DatabaseClient.Create().Result;
6+
7+
[Fact]
8+
public async Task IteratedRows_Throws_WhenCreate()
9+
{
10+
async Task<IEnumerable<IEnumerable<Value>>> Action() {
11+
var rs = await _db.Query("CREATE TABLE `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT)");
12+
13+
return rs.Rows.ToList();
14+
}
15+
16+
await Assert.ThrowsAsync<LibsqlException>(Action);
17+
}
18+
19+
[Fact]
20+
public async Task IteratedRows_Throws_WhenCreateIfNotExists()
21+
{
22+
var rs = await _db.Query("CREATE TABLE IF NOT EXISTS `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT)");
23+
24+
Assert.Empty(rs.Rows);
25+
}
26+
27+
[Fact]
28+
public async Task Rows_Empty_WhenInsert()
29+
{
30+
await _db.Query("CREATE TABLE `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT)");
31+
32+
var rs = await _db.Query("INSERT INTO `test` (`name`) VALUES ('libsql')");
33+
34+
Assert.Empty(rs.Rows);
35+
}
36+
37+
[Fact]
38+
public async Task Rows_Empty_WhenUpdate()
39+
{
40+
await _db.Query("CREATE TABLE `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT)");
41+
var rs = await _db.Query("INSERT INTO `test` (`name`) VALUES ('libsql')");
42+
Assert.Equal(1ul, rs.RowsAffected);
43+
44+
var rs2 = await _db.Query("UPDATE `test` SET `name` = 'libsql2' WHERE id = 1");
45+
46+
Assert.Empty(rs2.Rows);
47+
}
648

749
[Fact]
850
public async Task Rows_WhenEmpty()

Libsql.Client.Tests/StatementTests.cs

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,6 @@ public class StatementTests
44
{
55
private readonly IDatabaseClient _db = DatabaseClient.Create().Result;
66

7-
public StatementTests()
8-
{
9-
_db.Execute("CREATE TABLE `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT)");
10-
_db.Execute("INSERT INTO `test` VALUES ('a', 'b', 'c')");
11-
}
12-
13-
[Fact]
14-
public async Task Prepare_ReturnedStatement_CanBeExecuted()
15-
{
16-
using var statement = await _db.Prepare("SELECT `id` FROM `test` WHERE `name` = ?");
17-
18-
Assert.NotNull(statement);
19-
Assert.IsAssignableFrom<IStatement>(statement);
20-
}
21-
227
[Fact]
238
public async Task Statement_CanBind_Integer()
249
{
@@ -104,4 +89,42 @@ public async Task Statement_BoundValuesCount_IsCorrect()
10489

10590
Assert.Equal(3, numberOfBoundValues);
10691
}
92+
93+
[Fact]
94+
public async Task Database_CanQuery_Statements()
95+
{
96+
using var statement = await _db.Prepare("SELECT ?");
97+
var expected = 1;
98+
99+
statement.Bind(new Integer(expected));
100+
var rs = await _db.Query(statement);
101+
var row = rs.Rows.First();
102+
var value = row.First();
103+
var integer = Assert.IsType<Integer>(value);
104+
105+
Assert.Equal<int>(expected, integer);
106+
}
107+
108+
[Fact]
109+
public async Task Statement_CanExecute()
110+
{
111+
await _db.Execute("CREATE TABLE `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT)");
112+
using var statement = await _db.Prepare("INSERT INTO `test` (`name`) VALUES ('a'), ('b'), ('c')");
113+
114+
var rowsAffected = await statement.Execute();
115+
116+
Assert.Equal(3ul, rowsAffected);
117+
}
118+
119+
120+
[Fact]
121+
public async Task Database_CanExecute_Statements()
122+
{
123+
await _db.Execute("CREATE TABLE `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT)");
124+
using var statement = await _db.Prepare("INSERT INTO `test` (`name`) VALUES ('a'), ('b'), ('c')");
125+
126+
var rowsAffected = await _db.Execute(statement);
127+
128+
Assert.Equal(3ul, rowsAffected);
129+
}
107130
}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ await statement.Query(userId);
5757

5858
#### `Execute` vs. `Query`
5959

60-
`Execute` returns only the number of affected rows and is intended for statements where further detail is not necessary.
60+
`Execute` returns only the number of affected rows and is intended for statements where further detail is not necessary. A `LibSqlException` will be thrown if you use `Execute` on a statement that returns rows.
6161

6262
`Query` returns a more useful `IResultSet` object which can be read for additional information such as the number of affected rows, the last inserted row ID, the column names, and the rows themselves.
6363

0 commit comments

Comments
 (0)