Skip to content

Instantly share code, notes, and snippets.

@moodmosaic
Last active August 29, 2015 14:00
Show Gist options
  • Save moodmosaic/11169180 to your computer and use it in GitHub Desktop.
Save moodmosaic/11169180 to your computer and use it in GitHub Desktop.
mountebank mocks with F#
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
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