forked from fsprojects/Rezoom.SQL
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTestSelects.fs
More file actions
167 lines (142 loc) · 4.54 KB
/
Copy pathTestSelects.fs
File metadata and controls
167 lines (142 loc) · 4.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
module TypeProviderUser.TSQL.TestSelects
open System
open System.Threading
open System.Threading.Tasks
open NUnit.Framework
open FsUnit
open Rezoom
open Rezoom.SQL
open Rezoom.SQL.Plans
open MBrace.FsPickler
open Rezoom
type TestEqualInteger = SQL<"""
select * from Users where Id = @userId
""">
[<Test>]
let ``test = integer`` () =
let results = TestEqualInteger.Command(1L) |> runOnTestData
printfn "%A" results
Assert.AreEqual
( [ "Homer" ]
, [ for r in results -> r.Name ] |> List.sort
)
type TestInInteger = SQL<"""
select * from Users where Id in @userIds
""">
[<Test>]
let ``test in integer`` () =
let results = TestInInteger.Command([| 1L; 2L |]) |> runOnTestData
printfn "%A" results
Assert.AreEqual
( [ "Homer"; "Marge" ]
, [ for r in results -> r.Name ] |> List.sort
)
type TestInByteArrays = SQL<"""
select * from Pictures where SHA256 in @hashes
""">
[<Test>]
let ``test in byte arrays`` () =
let results = TestInByteArrays.Command([| Array.create 32 0uy; Array.create 32 0xffuy |]) |> runOnTestData
printfn "%A" results
Assert.AreEqual([ [||]; [||] ], [ for r in results -> r.PNGData ])
type TestDateTimeParameter = SQL<"""
select * from Users where Created > @created
""">
[<Test>]
let ``test datetime parameter`` () =
let results = TestDateTimeParameter.Command(DateTime.UtcNow) |> runOnTestData
printfn "%A" results
type TestOptionalDateTimeParameter = SQL<"""
select * from Users where Created > @created or @created is null
""">
[<Test>]
let ``test optional datetime parameter`` () =
let results = TestOptionalDateTimeParameter.Command(Some DateTime.UtcNow) |> runOnTestData
printfn "%A" results
type TestGuidParameter = SQL<"""
select * from Users where RandomId = @id;
""">
[<Test>]
let ``test guid parameter`` () =
let results = TestGuidParameter.Command(Guid.NewGuid()) |> runOnTestData
printfn "%A" results
type TestOptionalGuidParameter = SQL<"""
select * from Users where RandomId = @id or @id is null
""">
type TestInEmptySet = SQL<"""
select * from Users where RandomId in @ids
""">
[<Test>]
let ``test in empty set`` () =
let results = TestInEmptySet.Command([||]) |> runOnTestData
Assert.AreEqual(0, results.Count)
printfn "%A" results
[<Test>]
let ``test optional guid parameter`` () =
let results = TestOptionalGuidParameter.Command(Some (Guid.NewGuid())) |> runOnTestData
printfn "%A" results
type TestEmptyMany = SQL<"""
select p.*, many Children(c.*)
from Users p
left join Users c on false
""">
[<Test>]
let ``test empty many`` () =
let results = TestEmptyMany.Command() |> runOnTestData
Assert.AreEqual(2, results.Count)
for result in results do
Assert.AreEqual(0, result.Children.Count)
printfn "%A" results
[<Test>]
let ``replay works`` () =
let plan =
plan {
let! r1 = TestInInteger.Command([| 1L |]).Plan()
let! r2 = TestInInteger.Command([| 2L |]).Plan()
return r1.[0].Email, r2.[0].Email
}
let config = Execution.ExecutionConfig.Default
let serializer =
let bin = FsPickler.CreateBinarySerializer()
{ new Replay.IReplaySerializer with
member __.Serialize(o) = bin.Pickle(o)
member __.Deserialize(o) = bin.UnPickle(o)
}
let mutable saved = None
let save state arr =
saved <- Some (arr())
let recording =
Replay.RecordingExecutionStrategy.Create
( Execution.defaultExecutionStrategy
, serializer
, save
)
let played = recording.Execute(config, plan, CancellationToken.None).Result
match saved with
| None -> failwith "not saved"
| Some blob ->
let replayed = (Replay.replay config serializer blob).Result
if played = unbox replayed then
()
else failwith "not equal"
type InsertPicture = SQL<"insert into Pictures row SHA256 = @sha, PNGData = @png">
[<Test>]
let ``lotsa parameters`` () =
let task =
plan {
let g() = Guid.NewGuid().ToByteArray()
for i in batch [0..2000] do
do! InsertPicture.Command(g(), g()).Plan()
} |> Execution.execute Execution.ExecutionConfig.Default
task.Wait()
open Rezoom.SQL.Raw
open System.Data
type RawSQLQuery = SQL<"""
select * from Users where unsafe_inject_raw(@whereClause)
""">
[<Test>]
let ``test raw sql parameter`` () =
let results =
RawSQLQuery.Command(whereClause = [| sql "1="; arg 1 |]) |> runOnTestData
for result in results do
printfn "%A" result.Email