/
Tests.fs
161 lines (133 loc) · 4.12 KB
/
Tests.fs
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
module SAFE.Tests
open System
open System.IO
open Expecto
open Expecto.Logging
open Expecto.Logging.Message
open FsCheck
open Fake.Core
open Fake.IO
open Fake.IO.FileSystemOperators
let dotnet =
match Environment.GetEnvironmentVariable "DOTNET_PATH" with
| null -> "dotnet"
| x -> x
let fake =
match Environment.GetEnvironmentVariable "FAKE_PATH" with
| null -> "fake"
| x -> x
let psi exe arg dir (x: ProcStartInfo) : ProcStartInfo =
{ x with
FileName = exe
Arguments = arg
WorkingDirectory = dir }
let logger = Log.create "SAFE"
type TemplateArgs =
{ Server : string option
Deploy : string option
Layout : string option
JsDeps : string option
Remoting : bool }
override args.ToString () =
let optArg (name, value) =
value
|> Option.map (sprintf "--%s %s" name)
let remoting = if args.Remoting then Some "--remoting" else None
[ "server", args.Server
"deploy", args.Deploy
"layout", args.Layout
"js-deps", args.JsDeps ]
|> List.map optArg
|> fun x -> List.append x [remoting]
|> List.choose id
|> String.concat " "
let serverGen =
Gen.elements [
None
Some "giraffe"
Some "suave"
]
let deployGen =
Gen.elements [
None
Some "docker"
Some "azure"
]
let layoutGen =
Gen.elements [
None
Some "fulma-basic"
Some "fulma-admin"
Some "fulma-cover"
Some "fulma-hero"
Some "fulma-landing"
Some "fulma-login"
]
let jsDepsGen =
Gen.elements [
None
Some "npm"
]
type TemplateArgsArb () =
static member Arb () : Arbitrary<TemplateArgs> =
let generator : Gen<TemplateArgs> =
gen {
let! server = serverGen
let! deploy = deployGen
let! layout = layoutGen
let! jsDeps = jsDepsGen
let! remoting = Gen.elements [false; true]
return
{ Server = server
Deploy = deploy
Layout = layout
JsDeps = jsDeps
Remoting = remoting }
}
let shrinker (x : TemplateArgs) : seq<TemplateArgs> =
seq {
match x.Server with
| Some _ -> yield { x with Server = None }
| _ -> ()
match x.Deploy with
| Some _ -> yield { x with Deploy = None }
| _ -> ()
match x.Layout with
| Some _ -> yield { x with Layout = None }
| _ -> ()
match x.JsDeps with
| Some _ -> yield { x with JsDeps = None }
| _ -> ()
if x.Remoting then
yield { x with Remoting = false }
}
Arb.fromGenShrink (generator, shrinker)
let run exe arg dir =
logger.info(
eventX "Running `{exe} {arg}` in `{dir}`"
>> setField "exe" exe
>> setField "arg" arg
>> setField "dir" dir)
let result = Process.execWithResult (psi exe arg dir) TimeSpan.MaxValue
Expect.isTrue (result.OK) (sprintf "`%s %s` failed: %A" exe arg result.Errors)
let fsCheckConfig =
{ FsCheckConfig.defaultConfig with
arbitrary = [typeof<TemplateArgsArb>]
maxTest = 10 }
[<Tests>]
let tests =
testList "Project created from template" [
testPropertyWithConfig fsCheckConfig "Project should build properly" (fun (x : TemplateArgs) ->
let newSAFEArgs = x.ToString()
let uid = Guid.NewGuid().ToString("n")
let dir = Path.GetTempPath() </> uid
Directory.create dir
run dotnet (sprintf "new SAFE %s" newSAFEArgs) dir
Expect.isTrue (File.exists (dir </> "paket.lock")) (sprintf "paket.lock not present for '%s'" newSAFEArgs)
run fake "build" dir
logger.info(
eventX "Deleting `{dir}`"
>> setField "dir" dir)
Directory.delete dir
)
]