mirror of
https://github.com/Smaug123/gitea-repo-config
synced 2025-12-15 16:05:40 +00:00
Make types testable (#55)
This commit is contained in:
@@ -222,7 +222,7 @@ type Repo =
|
|||||||
Native = this.Native |> Option.map (fun s -> s.OverrideDefaults ())
|
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
|
if u.Mirror = Some true && not (String.IsNullOrEmpty u.OriginalUrl) then
|
||||||
{
|
{
|
||||||
Description = u.Description
|
Description = u.Description
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
<Compile Include="Map.fs" />
|
<Compile Include="Map.fs" />
|
||||||
<Compile Include="Async.fs" />
|
<Compile Include="Async.fs" />
|
||||||
<Compile Include="GiteaClient.fs" />
|
<Compile Include="GiteaClient.fs" />
|
||||||
|
<Compile Include="IGiteaClient.fs" />
|
||||||
<Compile Include="Domain.fs" />
|
<Compile Include="Domain.fs" />
|
||||||
<Compile Include="SerialisedConfigSchema.fs" />
|
<Compile Include="SerialisedConfigSchema.fs" />
|
||||||
<Compile Include="ConfigSchema.fs" />
|
<Compile Include="ConfigSchema.fs" />
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ module Gitea =
|
|||||||
|
|
||||||
let checkUsers
|
let checkUsers
|
||||||
(config : GiteaConfig)
|
(config : GiteaConfig)
|
||||||
(client : Gitea.Client)
|
(client : IGiteaClient)
|
||||||
: Async<Result<unit, Map<User, AlignmentError<UserInfo>>>>
|
: Async<Result<unit, Map<User, AlignmentError<UserInfo>>>>
|
||||||
=
|
=
|
||||||
async {
|
async {
|
||||||
@@ -69,7 +69,7 @@ module Gitea =
|
|||||||
let checkRepos
|
let checkRepos
|
||||||
(logger : ILogger)
|
(logger : ILogger)
|
||||||
(config : GiteaConfig)
|
(config : GiteaConfig)
|
||||||
(client : Gitea.Client)
|
(client : IGiteaClient)
|
||||||
: Async<Result<unit, Map<User, Map<RepoName, AlignmentError<Repo>>>>>
|
: Async<Result<unit, Map<User, Map<RepoName, AlignmentError<Repo>>>>>
|
||||||
=
|
=
|
||||||
async {
|
async {
|
||||||
@@ -151,7 +151,7 @@ module Gitea =
|
|||||||
|
|
||||||
let reconcileDifferingConfiguration
|
let reconcileDifferingConfiguration
|
||||||
(logger : ILogger)
|
(logger : ILogger)
|
||||||
(client : Gitea.Client)
|
(client : IGiteaClient)
|
||||||
(githubApiToken : string option)
|
(githubApiToken : string option)
|
||||||
(user : string)
|
(user : string)
|
||||||
(repoName : string)
|
(repoName : string)
|
||||||
@@ -512,7 +512,7 @@ module Gitea =
|
|||||||
|
|
||||||
let reconcileRepoErrors
|
let reconcileRepoErrors
|
||||||
(logger : ILogger)
|
(logger : ILogger)
|
||||||
(client : Gitea.Client)
|
(client : IGiteaClient)
|
||||||
(githubApiToken : string option)
|
(githubApiToken : string option)
|
||||||
(m : Map<User, Map<RepoName, AlignmentError<Repo>>>)
|
(m : Map<User, Map<RepoName, AlignmentError<Repo>>>)
|
||||||
: Async<unit>
|
: Async<unit>
|
||||||
@@ -619,7 +619,7 @@ module Gitea =
|
|||||||
let reconcileUserErrors
|
let reconcileUserErrors
|
||||||
(log : ILogger)
|
(log : ILogger)
|
||||||
(getUserInput : string -> string)
|
(getUserInput : string -> string)
|
||||||
(client : Gitea.Client)
|
(client : IGiteaClient)
|
||||||
(m : Map<User, AlignmentError<UserInfo>>)
|
(m : Map<User, AlignmentError<UserInfo>>)
|
||||||
=
|
=
|
||||||
let userInputLock = obj ()
|
let userInputLock = obj ()
|
||||||
|
|||||||
85
Gitea.Declarative.Lib/IGiteaClient.fs
Normal file
85
Gitea.Declarative.Lib/IGiteaClient.fs
Normal 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)
|
||||||
|
}
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Gitea.Declarative.Lib\Gitea.Declarative.Lib.fsproj" />
|
<ProjectReference Include="..\Gitea.Declarative.Lib\Gitea.Declarative.Lib.fsproj" />
|
||||||
|
<ProjectReference Include="..\Gitea.InMemory\Gitea.InMemory.fsproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Gitea.Declarative.Test", "G
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Gitea.Declarative", "Gitea.Declarative\Gitea.Declarative.fsproj", "{77DA39F7-AF01-448A-B71C-3D495EE2F6F4}"
|
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Gitea.Declarative", "Gitea.Declarative\Gitea.Declarative.fsproj", "{77DA39F7-AF01-448A-B71C-3D495EE2F6F4}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Gitea.InMemory", "Gitea.InMemory\Gitea.InMemory.fsproj", "{E7620129-398A-4BEA-9390-373BDF38C4B8}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
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}.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.ActiveCfg = Release|Any CPU
|
||||||
{77DA39F7-AF01-448A-B71C-3D495EE2F6F4}.Release|Any CPU.Build.0 = 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
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ module Program =
|
|||||||
client.BaseAddress <- args.GiteaHost
|
client.BaseAddress <- args.GiteaHost
|
||||||
client.DefaultRequestHeaders.Add ("Authorization", $"token {args.GiteaAdminApiToken}")
|
client.DefaultRequestHeaders.Add ("Authorization", $"token {args.GiteaAdminApiToken}")
|
||||||
|
|
||||||
let client = Gitea.Client client
|
let client = Gitea.Client client |> IGiteaClient.fromReal
|
||||||
|
|
||||||
task {
|
task {
|
||||||
logger.LogInformation "Checking users..."
|
logger.LogInformation "Checking users..."
|
||||||
|
|||||||
17
Gitea.InMemory/Gitea.InMemory.fsproj
Normal file
17
Gitea.InMemory/Gitea.InMemory.fsproj
Normal 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>
|
||||||
127
Gitea.InMemory/InMemoryGitea.fs
Normal file
127
Gitea.InMemory/InMemoryGitea.fs
Normal 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)
|
||||||
Reference in New Issue
Block a user