Last active
August 29, 2015 14:00
-
-
Save moodmosaic/11169180 to your computer and use it in GitHub Desktop.
mountebank mocks with F#
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace Mountebank | |
// PM> Install-Package FSharp.Data | |
open FSharp.Data | |
open System | |
module Imposter = | |
let Create protocol host port = | |
Http.Request( | |
"http://" + host + ":2525/imposters/", | |
headers = [ | |
"Content-Type", HttpContentTypes.Json; | |
"Accept", HttpContentTypes.Json ], | |
httpMethod = "POST", | |
body = | |
TextRequest | |
(sprintf @"{ ""port"": %i, ""protocol"": ""%s"" }" | |
port protocol)) | |
let GetCapturedRequests (spy : HttpResponse) = | |
let getRequests jsonValue = | |
match jsonValue with | |
| FSharp.Data.Record properties -> | |
match properties with | |
| [| protocol; port; requests; stubs; _links; |] -> | |
match snd requests with | |
| FSharp.Data.Array elements -> | |
match elements |> Seq.toList with | |
| head :: tail -> Some(elements) | |
| [] -> None | |
| _ -> None | |
| _ -> None | |
| _ -> None | |
let response = | |
Http.Request( | |
spy.Headers.Item "Location", | |
headers = [ | |
"Content-Type", HttpContentTypes.Json; | |
"Accept", HttpContentTypes.Json ], | |
httpMethod = "DELETE") | |
match response.Body with | |
| Text json -> | |
JsonValue.Parse json | |
|> getRequests | |
| _ -> None | |
module SmtpSpy = | |
let GetCapturedRequest imposter propertyName = | |
let filter properties propertyName = | |
match properties with | |
| [| _; _; _; _; _; _; _; _; _; _; _; _; _; _ |] -> | |
(properties | |
|> Array.filter (fun (name, _) -> name = propertyName) | |
|> Seq.head | |
|> snd).ToString().TrimStart('"').TrimEnd('"') | |
|> Some | |
| _ -> None | |
match Imposter.GetCapturedRequests imposter with | |
| Some actual -> | |
match actual |> Seq.head with | |
| FSharp.Data.Record properties -> filter properties propertyName | |
| _ -> None | |
| _ -> None |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Mountebank.Scenarios | |
// PM> Install-Package xunit | |
// PM> Install-Package Unquote | |
open System | |
open System.Net.Mail | |
open Xunit | |
let verify = Swensen.Unquote.Assertions.test | |
[<Fact>] | |
let SendMailTransmitsCorrectSubject () = | |
let expectedSubject = "Thank you for your order!" | |
let mountebankHost = "192.168.1.4" | |
let imposterPort = 4547 | |
let spy = Imposter.Create "smtp" mountebankHost imposterPort | |
(new SmtpClient(mountebankHost, imposterPort)).Send( | |
new MailMessage( | |
"[email protected]", | |
"[email protected]", | |
expectedSubject, | |
"Hello Customer, Thank you for your order from company.com.")) | |
verify <@ | |
match SmtpSpy.GetCapturedRequest spy "subject" with | |
| Some actual -> expectedSubject = actual | |
| None -> | |
raise <| InvalidOperationException( | |
"No property named 'subject' found in captured requests.") @> | |
[<Fact>] | |
let SendMailTransmitsCorrectNumberOfSmtpRequests () = | |
let expectedNumberOfRequests = 1 | |
let mountebankHost = "192.168.1.4" | |
let imposterPort = 4546 | |
let spy = Imposter.Create "smtp" mountebankHost imposterPort | |
(new SmtpClient(mountebankHost, imposterPort)).Send( | |
new MailMessage( | |
"[email protected]", | |
"[email protected]", | |
"Thank you for your order!", | |
"Hello Customer, Thank you for your order from company.com.")) | |
verify <@ | |
match Imposter.GetCapturedRequests spy with | |
| Some actual -> expectedNumberOfRequests = (actual |> Seq.length) | |
| None -> | |
raise <| InvalidOperationException( | |
sprintf "Expected %i calls but received none." | |
expectedNumberOfRequests) @> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment