Skip to content

Commit

Permalink
First test (#59)
Browse files Browse the repository at this point in the history
  • Loading branch information
Smaug123 authored Aug 6, 2023
1 parent 16e904c commit 6f1fbeb
Show file tree
Hide file tree
Showing 9 changed files with 172 additions and 7 deletions.
2 changes: 1 addition & 1 deletion Gitea.Declarative.Lib/Array.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ namespace Gitea.Declarative
[<RequireQualifiedAccess>]
module internal Array =

/// f takes a page number and a count.
/// f takes a page number and a limit (i.e. a desired page size).
let getPaginated (f : int64 -> int64 -> 'a array Async) : 'a list Async =
let count = 30

Expand Down
4 changes: 2 additions & 2 deletions Gitea.Declarative.Lib/Gitea.fs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ module Gitea =
let desiredUsers = config.Users

let! actualUsers =
Array.getPaginated (fun page count ->
client.AdminGetAllUsers (Some page, Some count) |> Async.AwaitTask
Array.getPaginated (fun page limit ->
client.AdminGetAllUsers (Some page, Some limit) |> Async.AwaitTask
)

let actualUsers =
Expand Down
4 changes: 2 additions & 2 deletions Gitea.Declarative.Lib/IGiteaClient.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ namespace Gitea.Declarative
open System.Threading.Tasks

type IGiteaClient =
abstract AdminGetAllUsers : page : int64 option * count : int64 option -> Gitea.User array Task
abstract AdminGetAllUsers : page : int64 option * limit : 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
Expand Down Expand Up @@ -42,7 +42,7 @@ type IGiteaClient =
module IGiteaClient =
let fromReal (client : Gitea.Client) : IGiteaClient =
{ new IGiteaClient with
member _.AdminGetAllUsers (page, count) = client.AdminGetAllUsers (page, count)
member _.AdminGetAllUsers (page, limit) = client.AdminGetAllUsers (page, limit)
member _.AdminCreateUser user = client.AdminCreateUser user
member _.AdminDeleteUser user = client.AdminDeleteUser user
member _.AdminEditUser (user, option) = client.AdminEditUser (user, option)
Expand Down
2 changes: 2 additions & 0 deletions Gitea.Declarative.Test/Gitea.Declarative.Test.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@

<ItemGroup>
<Compile Include="Utils.fs" />
<Compile Include="TestUser.fs" />
<Compile Include="TestJsonSchema.fs" />
<Compile Include="TestSwaggerJson.fs" />
<Content Include="GiteaConfig.json" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="FsCheck" Version="2.16.6" />
<PackageReference Include="FsUnit" Version="5.3.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
<PackageReference Include="NJsonSchema" Version="10.9.0" />
Expand Down
43 changes: 43 additions & 0 deletions Gitea.Declarative.Test/TestUser.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
namespace Gitea.Declarative.Test

open System
open System.Threading.Tasks
open FsCheck
open Gitea.InMemory
open Gitea.Declarative
open FsUnitTyped
open Microsoft.Extensions.Logging.Abstractions
open NUnit.Framework

[<TestFixture>]
[<RequireQualifiedAccess>]
module TestUser =

[<Test>]
let ``We set MustChangePassword on creating a user`` () =
Arb.register<CustomArb> () |> ignore

let property (desiredUser : UserInfo) =
let result = TaskCompletionSource<bool option> ()

let client =
{ GiteaClientMock.Unimplemented with
AdminCreateUser =
fun options ->
async {
result.SetResult options.MustChangePassword
return null
}
|> Async.StartAsTask
}

[ User "username", AlignmentError.DoesNotExist desiredUser ]
|> Map.ofList
|> Gitea.reconcileUserErrors NullLogger.Instance (fun _ -> failwith "do not ask for user input") client
|> Async.RunSynchronously

result.Task.Wait (TimeSpan.FromSeconds 10.0) |> shouldEqual true

result.Task.Result |> shouldEqual (Some true)

Check.QuickThrowOnFailure property
5 changes: 5 additions & 0 deletions Gitea.Declarative.Test/Utils.fs
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
namespace Gitea.Declarative.Test

open System
open System.IO
open FsCheck

type CustomArb () =
static member UriGen = Gen.constant (Uri "http://example.com") |> Arb.fromGen

[<RequireQualifiedAccess>]
module Utils =
Expand Down
114 changes: 114 additions & 0 deletions Gitea.InMemory/Client.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
namespace Gitea.InMemory

open System
open Gitea.Declarative

type private ServerState =
{
Users : Map<User, Gitea.CreateUserOption>
Repos : (User * Repo) list
}

member this.WithUser (create : Gitea.CreateUserOption) : ServerState =
let user = User create.Username

match Map.tryFind user this.Users with
| Some _ ->
create.Username
|> failwithf "Behaviour of in-memory Gitea is not defined for adding the same user multiple times. Got: %s"
| None ->
{ this with
Users = Map.add user create this.Users
}

static member Empty =
{
Users = Map.empty
Repos = []
}

type private ServerMessage = | AddUser of Gitea.CreateUserOption * AsyncReplyChannel<unit>

type Server =
private
| Server of MailboxProcessor<ServerMessage>

interface IDisposable with
member this.Dispose () =
match this with
| Server t -> t.Dispose ()

[<RequireQualifiedAccess>]
module Client =

let rec private loop (state : ServerState) (mailbox : MailboxProcessor<ServerMessage>) : Async<unit> =
async {
let! message = mailbox.Receive ()

match message with
| ServerMessage.AddUser (user, reply) ->
reply.Reply ()
return! loop (state.WithUser user) mailbox
}

let make () : Server * IGiteaClient =
let server = MailboxProcessor.Start (loop ServerState.Empty)

let client =
{ new IGiteaClient with
member _.AdminGetAllUsers (page, limit) = failwith "Not implemented"

member _.AdminCreateUser createUserOption =
async {
let! () = server.PostAndAsyncReply (fun reply -> AddUser (createUserOption, reply))
let result = Gitea.User ()
result.Email <- createUserOption.Email
result.Restricted <- createUserOption.Restricted
// TODO: what is this username used for anyway
// result.LoginName <- createUserOption.Username
result.Visibility <- createUserOption.Visibility
result.Created <- createUserOption.CreatedAt
result.FullName <- createUserOption.FullName
result.LoginName <- createUserOption.LoginName
return result
}
|> Async.StartAsTask

member _.AdminDeleteUser user = failwith "Not implemented"

member _.AdminEditUser (user, editUserOption) = failwith "Not implemented"

member _.AdminCreateRepo (user, createRepoOption) = failwith "Not implemented"

member _.UserListRepos (user, page, count) = failwith "Not implemented"

member _.RepoAddPushMirror (user, repo, createPushMirrorOption) = failwith "Not implemented"

member _.RepoListPushMirrors (loginName, userName, page, count) = failwith "Not implemented"

member _.RepoListBranchProtection (loginName, userName) = failwith "Not implemented"

member _.RepoDeleteBranchProtection (user, repo, branch) = failwith "Not implemented"

member _.RepoCreateBranchProtection (user, repo, createBranchProtectionOption) =
failwith "Not implemented"

member _.RepoEditBranchProtection (user, repo, branch, editBranchProtectionOption) =
failwith "Not implemented"

member _.RepoMigrate migrateRepoOptions = failwith "Not implemented"

member _.RepoGet (user, repo) = failwith "Not implemented"

member _.RepoDelete (user, repo) = failwith "Not implemented"

member _.RepoEdit (user, repo, editRepoOption) = failwith "Not implemented"

member _.RepoListCollaborators (loginName, userName, page, count) = failwith "Not implemented"

member _.RepoAddCollaborator (user, repo, collaborator) = failwith "Not implemented"

member _.RepoDeleteCollaborator (user, repo, collaborator) = failwith "Not implemented"
}

Server server, client
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ type GiteaClientMock =
}

interface IGiteaClient with
member this.AdminGetAllUsers (page, count) = this.AdminGetAllUsers (page, count)
member this.AdminGetAllUsers (page, limit) = this.AdminGetAllUsers (page, limit)
member this.AdminCreateUser user = this.AdminCreateUser user
member this.AdminDeleteUser user = this.AdminDeleteUser user
member this.AdminEditUser (user, option) = this.AdminEditUser (user, option)
Expand Down
3 changes: 2 additions & 1 deletion Gitea.InMemory/Gitea.InMemory.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
</PropertyGroup>

<ItemGroup>
<Compile Include="InMemoryGitea.fs" />
<Compile Include="Domain.fs" />
<Compile Include="Client.fs" />
</ItemGroup>

<ItemGroup>
Expand Down

0 comments on commit 6f1fbeb

Please sign in to comment.