mirror of
https://github.com/Smaug123/gitea-repo-config
synced 2025-10-04 23:18: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 ())
|
||||
}
|
||||
|
||||
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
|
||||
|
@@ -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" />
|
||||
|
@@ -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 ()
|
||||
|
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>
|
||||
<ProjectReference Include="..\Gitea.Declarative.Lib\Gitea.Declarative.Lib.fsproj" />
|
||||
<ProjectReference Include="..\Gitea.InMemory\Gitea.InMemory.fsproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@@ -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
|
||||
|
@@ -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..."
|
||||
|
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