Skip to content

Commit 9326086

Browse files
authored
Merge pull request #10 from SAFE-Stack/setup-tests
Add remoteData tests
2 parents 16897dc + 6e2ae8d commit 9326086

File tree

12 files changed

+1152
-21
lines changed

12 files changed

+1152
-21
lines changed

.config/dotnet-tools.json

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,22 @@
66
"version": "6.3.9",
77
"commands": [
88
"fantomas"
9-
]
9+
],
10+
"rollForward": false
1011
},
1112
"paket": {
1213
"version": "8.0.3",
1314
"commands": [
1415
"paket"
15-
]
16+
],
17+
"rollForward": false
18+
},
19+
"fable": {
20+
"version": "4.23.0",
21+
"commands": [
22+
"fable"
23+
],
24+
"rollForward": false
1625
}
1726
}
1827
}

.github/workflows/test.yaml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
name: SAFE meta automated tests
2+
3+
on: push
4+
5+
jobs:
6+
test:
7+
runs-on: ubuntu-latest
8+
9+
steps:
10+
- name: Checkout
11+
uses: actions/checkout@v4
12+
13+
- name: Install Node
14+
uses: actions/setup-node@v4
15+
with:
16+
node-version: 18
17+
18+
- name: Tool Restore
19+
run: dotnet tool restore
20+
21+
- name: Test
22+
working-directory: ./Build
23+
run: dotnet run --project Build.fsproj -- Test

Build/Build.fs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
open Fake.Core
22
open Fake.Core.TargetOperators
33
open Fake.IO
4+
open Fake.JavaScript
5+
46

57
let execContext = Context.FakeExecutionContext.Create false "build.fsx" []
68
Context.setExecutionContext (Context.RuntimeContext.Fake execContext)
@@ -23,8 +25,21 @@ module Processes =
2325
let sourceFolder = Path.getFullName """../src"""
2426
let outputFolder = Path.getFullName """../nugetPackages"""
2527

28+
let clientTestFolder = Path.getFullName """../test/SAFE.Client.Tests"""
29+
2630
let projects = [ "SAFE.Client"; "SAFE.Server" ]
2731

32+
Target.create "Test" (fun _ ->
33+
Npm.install (fun o -> {
34+
o with
35+
WorkingDirectory = clientTestFolder
36+
})
37+
38+
Npm.run "test" (fun o -> {
39+
o with
40+
WorkingDirectory = clientTestFolder
41+
}))
42+
2843
Target.create "Bundle" (fun _ ->
2944
let version = Environment.environVarOrFail "VERSION"
3045
let releaseNotes = Environment.environVarOrFail "RELEASE_NOTES_URL"

Build/paket.references

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
Fake.Core.Target
1+
Fake.Core.Target
2+
Fake.JavaScript.Npm

SAFE.Meta.sln

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SAFE.Server", "src\SAFE.Ser
1111
EndProject
1212
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Build", "Build\Build.fsproj", "{F49104E3-DBA9-4A2D-B839-B4E60BCAE698}"
1313
EndProject
14+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{387BFC82-96EA-4C10-A08E-C25588EE2223}"
15+
EndProject
16+
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SAFE.Client.Tests", "test\SAFE.Client.Tests\SAFE.Client.Tests.fsproj", "{ECC5C643-1340-4718-8381-E3D1E835C3E3}"
17+
EndProject
1418
Global
1519
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1620
Debug|Any CPU = Debug|Any CPU
@@ -32,9 +36,13 @@ Global
3236
{F49104E3-DBA9-4A2D-B839-B4E60BCAE698}.Debug|Any CPU.Build.0 = Debug|Any CPU
3337
{F49104E3-DBA9-4A2D-B839-B4E60BCAE698}.Release|Any CPU.ActiveCfg = Release|Any CPU
3438
{F49104E3-DBA9-4A2D-B839-B4E60BCAE698}.Release|Any CPU.Build.0 = Release|Any CPU
39+
{ECC5C643-1340-4718-8381-E3D1E835C3E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
40+
{ECC5C643-1340-4718-8381-E3D1E835C3E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
41+
{ECC5C643-1340-4718-8381-E3D1E835C3E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
42+
{ECC5C643-1340-4718-8381-E3D1E835C3E3}.Release|Any CPU.Build.0 = Release|Any CPU
3543
EndGlobalSection
3644
GlobalSection(NestedProjects) = preSolution
3745
{5BCFE180-027E-40F9-847B-7B36F10BD5D7} = {59161B7D-F517-4F4B-B28D-33E34B8A930E}
3846
{0C8F62AC-D5D8-43E6-A4C7-159E530C3CE5} = {59161B7D-F517-4F4B-B28D-33E34B8A930E}
3947
EndGlobalSection
40-
EndGlobal
48+
EndGlobal

paket.dependencies

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ framework: net8.0
33
storage: none
44

55
nuget Fake.Core.Target
6+
nuget Fake.JavaScript.Npm
67
nuget FSharp.Core ~> 8
78

89
nuget Fable.Remoting.Giraffe ~> 5

paket.lock

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,22 +81,22 @@ NUGET
8181
Fake.Core.CommandLineParsing (6.1)
8282
FParsec (>= 1.1.1)
8383
FSharp.Core (>= 8.0.301)
84-
Fake.Core.Context (6.1)
84+
Fake.Core.Context (6.1.3)
8585
FSharp.Core (>= 8.0.301)
86-
Fake.Core.Environment (6.1)
86+
Fake.Core.Environment (6.1.3)
8787
FSharp.Core (>= 8.0.301)
88-
Fake.Core.FakeVar (6.1)
89-
Fake.Core.Context (>= 6.1)
88+
Fake.Core.FakeVar (6.1.3)
89+
Fake.Core.Context (>= 6.1.3)
9090
FSharp.Core (>= 8.0.301)
91-
Fake.Core.Process (6.1)
92-
Fake.Core.Environment (>= 6.1)
93-
Fake.Core.FakeVar (>= 6.1)
94-
Fake.Core.String (>= 6.1)
95-
Fake.Core.Trace (>= 6.1)
96-
Fake.IO.FileSystem (>= 6.1)
91+
Fake.Core.Process (6.1.3)
92+
Fake.Core.Environment (>= 6.1.3)
93+
Fake.Core.FakeVar (>= 6.1.3)
94+
Fake.Core.String (>= 6.1.3)
95+
Fake.Core.Trace (>= 6.1.3)
96+
Fake.IO.FileSystem (>= 6.1.3)
9797
FSharp.Core (>= 8.0.301)
9898
System.Collections.Immutable (>= 8.0)
99-
Fake.Core.String (6.1)
99+
Fake.Core.String (6.1.3)
100100
FSharp.Core (>= 8.0.301)
101101
Fake.Core.Target (6.1)
102102
Fake.Core.CommandLineParsing (>= 6.1)
@@ -108,13 +108,20 @@ NUGET
108108
Fake.Core.Trace (>= 6.1)
109109
FSharp.Control.Reactive (>= 5.0.2)
110110
FSharp.Core (>= 8.0.301)
111-
Fake.Core.Trace (6.1)
112-
Fake.Core.Environment (>= 6.1)
113-
Fake.Core.FakeVar (>= 6.1)
111+
Fake.Core.Trace (6.1.3)
112+
Fake.Core.Environment (>= 6.1.3)
113+
Fake.Core.FakeVar (>= 6.1.3)
114114
FSharp.Core (>= 8.0.301)
115-
Fake.IO.FileSystem (6.1)
116-
Fake.Core.String (>= 6.1)
117-
Fake.Core.Trace (>= 6.1)
115+
Fake.IO.FileSystem (6.1.3)
116+
Fake.Core.String (>= 6.1.3)
117+
Fake.Core.Trace (>= 6.1.3)
118+
FSharp.Core (>= 8.0.301)
119+
Fake.JavaScript.Npm (6.1.3)
120+
Fake.Core.Process (>= 6.1.3)
121+
Fake.Testing.Common (>= 6.1.3)
122+
FSharp.Core (>= 8.0.301)
123+
Fake.Testing.Common (6.1.3)
124+
Fake.Core.Trace (>= 6.1.3)
118125
FSharp.Core (>= 8.0.301)
119126
Feliz (2.8)
120127
Fable.ReactDom.Types (>= 18.2)

test/SAFE.Client.Tests/Program.fs

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
module Client.Tests
2+
3+
open Fable.Mocha
4+
open SAFE
5+
6+
[<RequireQualifiedAccess>]
7+
type RemoteDataCase =
8+
| NotStarted
9+
| LoadingEmpty
10+
| LoadingPopulated
11+
| Loaded
12+
13+
member this.Label =
14+
match this with
15+
| NotStarted -> "Not started"
16+
| LoadingEmpty -> "Loading empty"
17+
| LoadingPopulated -> "Loading populated"
18+
| Loaded -> "loaded"
19+
20+
member this.Example =
21+
match this with
22+
| NotStarted -> RemoteData.NotStarted
23+
| LoadingEmpty -> Loading None
24+
| LoadingPopulated -> Loading(Some true)
25+
| Loaded -> RemoteData.Loaded true
26+
27+
module RemoteDataCase =
28+
let all = [
29+
RemoteDataCase.NotStarted
30+
RemoteDataCase.LoadingEmpty
31+
RemoteDataCase.LoadingPopulated
32+
RemoteDataCase.Loaded
33+
]
34+
35+
36+
let inline testListForAll<'T when 'T: equality>
37+
title
38+
(transformation: RemoteData<bool> -> 'T)
39+
(expectedMaker: RemoteDataCase -> 'T)
40+
=
41+
42+
testList
43+
title
44+
(all
45+
|> List.map (fun case ->
46+
let expected = expectedMaker case
47+
48+
(fun _ -> Expect.equal (transformation case.Example) expected "")
49+
|> testCase case.Label))
50+
51+
let remoteData =
52+
testList "RemoteData" [
53+
RemoteDataCase.testListForAll "defaultValue" (fun case -> case.DefaultValue false) (function
54+
| RemoteDataCase.NotStarted
55+
| RemoteDataCase.LoadingEmpty -> false
56+
| RemoteDataCase.LoadingPopulated
57+
| RemoteDataCase.Loaded -> true)
58+
59+
RemoteDataCase.testListForAll "HasLoaded" (_.HasLoaded) (function
60+
| RemoteDataCase.NotStarted
61+
| RemoteDataCase.LoadingEmpty
62+
| RemoteDataCase.LoadingPopulated -> false
63+
| RemoteDataCase.Loaded -> true)
64+
65+
RemoteDataCase.testListForAll "AsOption" (_.AsOption) (function
66+
| RemoteDataCase.NotStarted
67+
| RemoteDataCase.LoadingEmpty -> None
68+
| RemoteDataCase.LoadingPopulated
69+
| RemoteDataCase.Loaded -> Some true)
70+
71+
RemoteDataCase.testListForAll "hasStarted" (_.HasStarted) (function
72+
| RemoteDataCase.NotStarted -> false
73+
| RemoteDataCase.LoadingEmpty
74+
| RemoteDataCase.LoadingPopulated
75+
| RemoteDataCase.Loaded -> true)
76+
77+
RemoteDataCase.testListForAll "hasData" (_.HasData) (function
78+
| RemoteDataCase.NotStarted
79+
| RemoteDataCase.LoadingEmpty -> false
80+
| RemoteDataCase.LoadingPopulated
81+
| RemoteDataCase.Loaded -> true)
82+
83+
RemoteDataCase.testListForAll "isStillLoading" (_.IsStillLoading) (function
84+
| RemoteDataCase.NotStarted -> false
85+
| RemoteDataCase.LoadingEmpty
86+
| RemoteDataCase.LoadingPopulated -> true
87+
| RemoteDataCase.Loaded -> false)
88+
89+
RemoteDataCase.testListForAll "isRefresing" (_.IsRefreshing) (function
90+
| RemoteDataCase.NotStarted -> false
91+
| RemoteDataCase.LoadingEmpty -> false
92+
| RemoteDataCase.LoadingPopulated -> true
93+
| RemoteDataCase.Loaded -> false)
94+
95+
RemoteDataCase.testListForAll "hasNotStarted" (_.HasNotStarted) (function
96+
| RemoteDataCase.NotStarted -> true
97+
| RemoteDataCase.LoadingEmpty
98+
| RemoteDataCase.LoadingPopulated
99+
| RemoteDataCase.Loaded -> false)
100+
101+
RemoteDataCase.testListForAll "map" (_.Map(not)) (function
102+
| RemoteDataCase.NotStarted -> NotStarted
103+
| RemoteDataCase.LoadingEmpty -> Loading None
104+
| RemoteDataCase.LoadingPopulated -> Loading(Some false)
105+
| RemoteDataCase.Loaded -> Loaded false)
106+
107+
testList "bind" [
108+
RemoteDataCase.testListForAll "toLoaded" (_.Bind(Loaded)) (function
109+
| RemoteDataCase.NotStarted -> NotStarted
110+
| RemoteDataCase.LoadingEmpty -> Loading None
111+
| RemoteDataCase.LoadingPopulated
112+
| RemoteDataCase.Loaded -> Loaded true)
113+
114+
RemoteDataCase.testListForAll "toNotStarted" (_.Bind(fun _ -> NotStarted)) (function
115+
| RemoteDataCase.NotStarted -> NotStarted
116+
| RemoteDataCase.LoadingEmpty -> Loading None
117+
| RemoteDataCase.LoadingPopulated
118+
| RemoteDataCase.Loaded -> NotStarted)
119+
]
120+
121+
RemoteDataCase.testListForAll "startLoading" (_.StartLoading()) (function
122+
| RemoteDataCase.NotStarted -> Loading None
123+
| RemoteDataCase.LoadingEmpty -> Loading None
124+
| RemoteDataCase.LoadingPopulated -> Loading (Some true)
125+
| RemoteDataCase.Loaded -> Loading (Some true))
126+
]
127+
128+
[<EntryPoint>]
129+
let main _ = Mocha.runTests remoteData
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project Sdk="Microsoft.NET.Sdk">
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<RootNamespace>SAFE.Client</RootNamespace>
6+
</PropertyGroup>
7+
<ItemGroup>
8+
<Compile Include="Program.fs" />
9+
<Content Include="paket.references" />
10+
<Content Include="package-lock.json" />
11+
<Content Include="package.json" />
12+
</ItemGroup>
13+
<ItemGroup>
14+
<ProjectReference Include="..\..\src\SAFE.Client\SAFE.Client.fsproj" />
15+
</ItemGroup>
16+
<Import Project="..\..\.paket\Paket.Restore.targets" />
17+
</Project>

0 commit comments

Comments
 (0)