Make types testable (#55)

This commit is contained in:
Patrick Stevens
2023-08-05 01:00:53 +01:00
committed by GitHub
parent f247ef704d
commit 7dd7d768ae
9 changed files with 244 additions and 7 deletions

View File

@@ -222,7 +222,7 @@ type Repo =
Native = this.Native |> Option.map (fun s -> s.OverrideDefaults ())
}
static member Render (client : Gitea.Client) (u : Gitea.Repository) : Repo Async =
static member Render (client : IGiteaClient) (u : Gitea.Repository) : Repo Async =
if u.Mirror = Some true && not (String.IsNullOrEmpty u.OriginalUrl) then
{
Description = u.Description

View File

@@ -21,6 +21,7 @@
<Compile Include="Map.fs" />
<Compile Include="Async.fs" />
<Compile Include="GiteaClient.fs" />
<Compile Include="IGiteaClient.fs" />
<Compile Include="Domain.fs" />
<Compile Include="SerialisedConfigSchema.fs" />
<Compile Include="ConfigSchema.fs" />

View File

@@ -19,7 +19,7 @@ module Gitea =
let checkUsers
(config : GiteaConfig)
(client : Gitea.Client)
(client : IGiteaClient)
: Async<Result<unit, Map<User, AlignmentError<UserInfo>>>>
=
async {
@@ -69,7 +69,7 @@ module Gitea =
let checkRepos
(logger : ILogger)
(config : GiteaConfig)
(client : Gitea.Client)
(client : IGiteaClient)
: Async<Result<unit, Map<User, Map<RepoName, AlignmentError<Repo>>>>>
=
async {
@@ -151,7 +151,7 @@ module Gitea =
let reconcileDifferingConfiguration
(logger : ILogger)
(client : Gitea.Client)
(client : IGiteaClient)
(githubApiToken : string option)
(user : string)
(repoName : string)
@@ -512,7 +512,7 @@ module Gitea =
let reconcileRepoErrors
(logger : ILogger)
(client : Gitea.Client)
(client : IGiteaClient)
(githubApiToken : string option)
(m : Map<User, Map<RepoName, AlignmentError<Repo>>>)
: Async<unit>
@@ -619,7 +619,7 @@ module Gitea =
let reconcileUserErrors
(log : ILogger)
(getUserInput : string -> string)
(client : Gitea.Client)
(client : IGiteaClient)
(m : Map<User, AlignmentError<UserInfo>>)
=
let userInputLock = obj ()

View File

@@ -0,0 +1,85 @@
namespace Gitea.Declarative
open System.Threading.Tasks
type IGiteaClient =
abstract AdminGetAllUsers : page : int64 option * count : int64 option -> Gitea.User array Task
abstract AdminCreateUser : Gitea.CreateUserOption -> Gitea.User Task
abstract AdminDeleteUser : user : string -> unit Task
abstract AdminEditUser : user : string * Gitea.EditUserOption -> Gitea.User Task
abstract AdminCreateRepo : user : string * Gitea.CreateRepoOption -> Gitea.Repository Task
abstract UserListRepos : string * page : int64 option * count : int64 option -> Gitea.Repository array Task
abstract RepoAddPushMirror : user : string * repo : string * Gitea.CreatePushMirrorOption -> Gitea.PushMirror Task
abstract RepoListPushMirrors :
loginName : string * userName : string * page : int64 option * count : int64 option ->
Gitea.PushMirror array Task
abstract RepoListBranchProtection : loginName : string * userName : string -> Gitea.BranchProtection array Task
abstract RepoDeleteBranchProtection : user : string * repo : string * branch : string -> unit Task
abstract RepoCreateBranchProtection :
user : string * repo : string * Gitea.CreateBranchProtectionOption -> Gitea.BranchProtection Task
abstract RepoEditBranchProtection :
user : string * repo : string * branch : string * Gitea.EditBranchProtectionOption ->
Gitea.BranchProtection Task
abstract RepoMigrate : Gitea.MigrateRepoOptions -> Gitea.Repository Task
abstract RepoGet : user : string * repo : string -> Gitea.Repository Task
abstract RepoDelete : user : string * repo : string -> unit Task
abstract RepoEdit : user : string * repo : string * Gitea.EditRepoOption -> Gitea.Repository Task
abstract RepoListCollaborators :
loginName : string * userName : string * page : int64 option * count : int64 option -> Gitea.User array Task
abstract RepoAddCollaborator : user : string * repo : string * collaborator : string -> unit Task
abstract RepoDeleteCollaborator : user : string * repo : string * collaborator : string -> unit Task
[<RequireQualifiedAccess>]
module IGiteaClient =
let fromReal (client : Gitea.Client) : IGiteaClient =
{ new IGiteaClient with
member _.AdminGetAllUsers (page, count) = client.AdminGetAllUsers (page, count)
member _.AdminCreateUser user = client.AdminCreateUser user
member _.AdminDeleteUser user = client.AdminDeleteUser user
member _.AdminEditUser (user, option) = client.AdminEditUser (user, option)
member _.AdminCreateRepo (user, option) = client.AdminCreateRepo (user, option)
member _.UserListRepos (user, page, count) =
client.UserListRepos (user, page, count)
member _.RepoAddPushMirror (user, repo, options) =
client.RepoAddPushMirror (user, repo, options)
member _.RepoListPushMirrors (loginName, userName, page, count) =
client.RepoListPushMirrors (loginName, userName, page, count)
member _.RepoListBranchProtection (login, user) =
client.RepoListBranchProtection (login, user)
member _.RepoDeleteBranchProtection (user, repo, branch) =
client.RepoDeleteBranchProtection (user, repo, branch)
member _.RepoCreateBranchProtection (user, repo, options) =
client.RepoCreateBranchProtection (user, repo, options)
member _.RepoEditBranchProtection (user, repo, branch, edit) =
client.RepoEditBranchProtection (user, repo, branch, edit)
member _.RepoMigrate options = client.RepoMigrate options
member _.RepoGet (user, repo) = client.RepoGet (user, repo)
member _.RepoDelete (user, repo) = client.RepoDelete (user, repo)
member _.RepoEdit (user, repo, options) = client.RepoEdit (user, repo, options)
member _.RepoListCollaborators (login, user, page, count) =
client.RepoListCollaborators (login, user, page, count)
member _.RepoAddCollaborator (user, repo, collaborator) =
client.RepoAddCollaborator (user, repo, collaborator)
member _.RepoDeleteCollaborator (user, repo, collaborator) =
client.RepoDeleteCollaborator (user, repo, collaborator)
}

View File

@@ -24,6 +24,7 @@
<ItemGroup>
<ProjectReference Include="..\Gitea.Declarative.Lib\Gitea.Declarative.Lib.fsproj" />
<ProjectReference Include="..\Gitea.InMemory\Gitea.InMemory.fsproj" />
</ItemGroup>
</Project>

View File

@@ -6,6 +6,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Gitea.Declarative.Test", "G
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Gitea.Declarative", "Gitea.Declarative\Gitea.Declarative.fsproj", "{77DA39F7-AF01-448A-B71C-3D495EE2F6F4}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Gitea.InMemory", "Gitea.InMemory\Gitea.InMemory.fsproj", "{E7620129-398A-4BEA-9390-373BDF38C4B8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -24,5 +26,9 @@ Global
{77DA39F7-AF01-448A-B71C-3D495EE2F6F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{77DA39F7-AF01-448A-B71C-3D495EE2F6F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{77DA39F7-AF01-448A-B71C-3D495EE2F6F4}.Release|Any CPU.Build.0 = Release|Any CPU
{E7620129-398A-4BEA-9390-373BDF38C4B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E7620129-398A-4BEA-9390-373BDF38C4B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E7620129-398A-4BEA-9390-373BDF38C4B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E7620129-398A-4BEA-9390-373BDF38C4B8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@@ -83,7 +83,7 @@ module Program =
client.BaseAddress <- args.GiteaHost
client.DefaultRequestHeaders.Add ("Authorization", $"token {args.GiteaAdminApiToken}")
let client = Gitea.Client client
let client = Gitea.Client client |> IGiteaClient.fromReal
task {
logger.LogInformation "Checking users..."

View File

@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Compile Include="InMemoryGitea.fs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Gitea.Declarative.Lib\Gitea.Declarative.Lib.fsproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,127 @@
namespace Gitea.InMemory
open System
open System.Threading.Tasks
open Gitea.Declarative
type BranchName = | BranchName of string
type BranchProtectionRule =
{
RequiredChecks : string Set
}
type NativeRepo =
{
BranchProtectionRules : (BranchName * BranchProtectionRule) list
}
type Repo =
| GitHubMirror of Uri
| NativeRepo of NativeRepo
type GiteaState =
{
Users : User Set
Repositories : Map<User * RepoName, Repo>
}
/// Allows us to use handy record-updating syntax.
/// (I have a considerable dislike of Moq and friends.)
type GiteaClientMock =
{
AdminGetAllUsers : int64 option * int64 option -> Gitea.User array Task
AdminCreateUser : Gitea.CreateUserOption -> Gitea.User Task
AdminDeleteUser : string -> unit Task
AdminEditUser : string * Gitea.EditUserOption -> Gitea.User Task
AdminCreateRepo : string * Gitea.CreateRepoOption -> Gitea.Repository Task
UserListRepos : string * int64 option * int64 option -> Gitea.Repository array Task
RepoAddPushMirror : string * string * Gitea.CreatePushMirrorOption -> Gitea.PushMirror Task
RepoListPushMirrors : string * string * int64 option * int64 option -> Gitea.PushMirror array Task
RepoListBranchProtection : string * string -> Gitea.BranchProtection array Task
RepoDeleteBranchProtection : string * string * string -> unit Task
RepoCreateBranchProtection : string * string * Gitea.CreateBranchProtectionOption -> Gitea.BranchProtection Task
RepoEditBranchProtection :
string * string * string * Gitea.EditBranchProtectionOption -> Gitea.BranchProtection Task
RepoMigrate : Gitea.MigrateRepoOptions -> Gitea.Repository Task
RepoGet : string * string -> Gitea.Repository Task
RepoDelete : string * string -> unit Task
RepoEdit : string * string * Gitea.EditRepoOption -> Gitea.Repository Task
RepoListCollaborators : string * string * int64 option * int64 option -> Gitea.User array Task
RepoAddCollaborator : string * string * string -> unit Task
RepoDeleteCollaborator : string * string * string -> unit Task
}
static member Unimplemented =
{
AdminGetAllUsers = fun _ -> failwith "Unimplemented"
AdminCreateUser = fun _ -> failwith "Unimplemented"
AdminDeleteUser = fun _ -> failwith "Unimplemented"
AdminEditUser = fun _ -> failwith "Unimplemented"
AdminCreateRepo = fun _ -> failwith "Unimplemented"
UserListRepos = fun _ -> failwith "Unimplemented"
RepoAddPushMirror = fun _ -> failwith "Unimplemented"
RepoListPushMirrors = fun _ -> failwith "Unimplemented"
RepoListBranchProtection = fun _ -> failwith "Unimplemented"
RepoDeleteBranchProtection = fun _ -> failwith "Unimplemented"
RepoCreateBranchProtection = fun _ -> failwith "Unimplemented"
RepoEditBranchProtection = fun _ -> failwith "Unimplemented"
RepoMigrate = fun _ -> failwith "Unimplemented"
RepoGet = fun _ -> failwith "Unimplemented"
RepoDelete = fun _ -> failwith "Unimplemented"
RepoEdit = fun _ -> failwith "Unimplemented"
RepoListCollaborators = fun _ -> failwith "Unimplemented"
RepoAddCollaborator = fun _ -> failwith "Unimplemented"
RepoDeleteCollaborator = fun _ -> failwith "Unimplemented"
}
interface IGiteaClient with
member this.AdminGetAllUsers (page, count) = this.AdminGetAllUsers (page, count)
member this.AdminCreateUser user = this.AdminCreateUser user
member this.AdminDeleteUser user = this.AdminDeleteUser user
member this.AdminEditUser (user, option) = this.AdminEditUser (user, option)
member this.AdminCreateRepo (user, option) = this.AdminCreateRepo (user, option)
member this.UserListRepos (user, page, count) = this.UserListRepos (user, page, count)
member this.RepoAddPushMirror (user, repo, options) =
this.RepoAddPushMirror (user, repo, options)
member this.RepoListPushMirrors (loginName, userName, page, count) =
this.RepoListPushMirrors (loginName, userName, page, count)
member this.RepoListBranchProtection (login, user) =
this.RepoListBranchProtection (login, user)
member this.RepoDeleteBranchProtection (user, repo, branch) =
this.RepoDeleteBranchProtection (user, repo, branch)
member this.RepoCreateBranchProtection (user, repo, options) =
this.RepoCreateBranchProtection (user, repo, options)
member this.RepoEditBranchProtection (user, repo, branch, edit) =
this.RepoEditBranchProtection (user, repo, branch, edit)
member this.RepoMigrate options = this.RepoMigrate options
member this.RepoGet (user, repo) = this.RepoGet (user, repo)
member this.RepoDelete (user, repo) = this.RepoDelete (user, repo)
member this.RepoEdit (user, repo, options) = this.RepoEdit (user, repo, options)
member this.RepoListCollaborators (login, user, page, count) =
this.RepoListCollaborators (login, user, page, count)
member this.RepoAddCollaborator (user, repo, collaborator) =
this.RepoAddCollaborator (user, repo, collaborator)
member this.RepoDeleteCollaborator (user, repo, collaborator) =
this.RepoDeleteCollaborator (user, repo, collaborator)