{"id":23028906,"url":"https://github.com/maiha/http-mock","last_synced_at":"2025-09-13T07:34:11.815Z","repository":{"id":34294183,"uuid":"38193728","full_name":"maiha/http-mock","owner":"maiha","description":"Real http server for stubbing and expectations in Scala","archived":false,"fork":false,"pushed_at":"2017-11-22T03:21:25.000Z","size":52,"stargazers_count":3,"open_issues_count":0,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2023-07-07T14:36:19.212Z","etag":null,"topics":["http","mock","scala"],"latest_commit_sha":null,"homepage":null,"language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maiha.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-06-28T09:40:12.000Z","updated_at":"2023-07-07T14:36:19.212Z","dependencies_parsed_at":"2022-09-14T03:31:13.699Z","dependency_job_id":null,"html_url":"https://github.com/maiha/http-mock","commit_stats":null,"previous_names":[],"tags_count":6,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maiha%2Fhttp-mock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maiha%2Fhttp-mock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maiha%2Fhttp-mock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maiha%2Fhttp-mock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maiha","download_url":"https://codeload.github.com/maiha/http-mock/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":229827764,"owners_count":18130394,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["http","mock","scala"],"created_at":"2024-12-15T14:13:14.590Z","updated_at":"2024-12-15T14:13:15.269Z","avatar_url":"https://github.com/maiha.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/maiha/http-mock.svg?branch=master)](https://travis-ci.org/maiha/http-mock)\n[![scala 2.11](https://maven-badges.herokuapp.com/maven-central/sc.ala/http-mock_2.11/badge.svg)](https://maven-badges.herokuapp.com/maven-central/sc.ala/http-mock_2.11)\n[![scala 2.12](https://maven-badges.herokuapp.com/maven-central/sc.ala/http-mock_2.12/badge.svg)](https://maven-badges.herokuapp.com/maven-central/sc.ala/http-mock_2.12)\n[![scaladoc](http://javadoc-badge.appspot.com/sc.ala/http-mock_2.11.svg?label=scaladoc)](http://javadoc-badge.appspot.com/sc.ala/http-mock_2.11)\n\n# HttpMock\n\nReal http server for stubbing and expectations in Scala\n\nFeatures\n========\n\n- Stubbing HTTP requests at real Http Server\n  - responds always OK for any methods and paths\n  - supported methods: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS\n- Expecting HTTP requests as AccessLog\n  - asserts AccessLog about methods and counts\n\nStubbing\n========\n\n#### start (random port)\n\n```scala\nimport sc.ala.http.mock._\nval server = HttpMock.start()\nserver.port  // =\u003e 37781 (automatically set by default)\n// send requests to \"http://127.0.0.1:37781\" (or server.url)\nserver.stop\n```\n\n#### start with port\n\n```scala\nval server = HttpMock.start(9000)\nserver.port  // =\u003e 9000\n```\n\n#### restartable\n\n- HttpMock is immutable\n\n```scala\nval server    = HttpMock.start(9000)  // GET: ok\nval stopped   = server.stop()         // GET: error\nval restarted = stopped.start()       // GET: ok\n```\n\n#### loan pattern\n\n- `run()` ensures `server.stop()` after action\n\n```scala\nHttpMock.run()      { server =\u003e ... }\nHttpMock.run(port)  { server =\u003e ... }\nSetting(port).run() { server =\u003e ... }\n```\n\n#### restrict methods\n\n- default: accept all methods\n\n```scala\nval server = Setting(methods = Set(GET, POST)).start()\n/*\n  GET  =\u003e 200\n  POST =\u003e 200\n  PUT  =\u003e 404\n*/\n```\n\n### customize request handler\n\n```scala\nval server = Setting(handler = {\n    case h: RequestHeader if h.version == \"HTTP/1.0\" =\u003e Results.HttpVersionNotSupported\n})\n/*\n  GET  =\u003e 200\n  GET with HTTP/1.0 =\u003e 505\n*/\n```\n\nExpectations\n============\n\n- implemented expectations:\n  - method, body, header, count\n\n```scala\nimport sc.ala.http.mock._\nimport scala.concurrent.duration._\n\nval server = HttpMock.start(9000)\n```\n\n#### assert methods and counts\n\n```shell\ncurl http://127.0.0.1:9000/\n```\n\n```scala\nserver.logs.expect(GET , count = 1)(1.second)  // (PASS)\nserver.logs.expect(GET , count = 2)(1.second)  // java.lang.AssertionError\nserver.logs.expect(POST, count = 1)(1.second)  // java.lang.AssertionError\n\nserver.stop()\n```\n\n#### assert methods and body and headers\n\n```shell\ncurl -X POST -H \"Content-type: application/octet-stream\" http://127.0.0.1:9000/ -d foo\ncurl -X POST -H \"Content-type: application/octet-stream\" http://127.0.0.1:9000/ -d bar\ncurl -X POST -H \"Content-type: application/octet-stream\" -H \"X-ID: 1\" http://127.0.0.1:9000/ -d bar\n```\n\n```scala\nserver.logs.expect(POST).body(\"foo\")(1.second)           // (PASS)\nserver.logs.expect(POST).body(\"bar\")(1.second)           // java.lang.AssertionError\nserver.logs.expect(POST).body(\"bar\").count(2)(1.second)  // (PASS)\nserver.logs.expect(POST).body(\"baz\")(1.second)           // java.lang.AssertionError\nserver.logs.expect(POST).header(\"X-ID\", \"1\")(1.second)   // (PASS)\n\nserver.stop()\n```\n\n#### assert bodies as Set\n\n```shell\ncurl -X POST -H \"Content-type: application/octet-stream\" http://127.0.0.1:9000/ -d foo\ncurl -X POST -H \"Content-type: application/octet-stream\" http://127.0.0.1:9000/ -d bar\ncurl -X POST -H \"Content-type: application/octet-stream\" -H \"X-ID: 1\" http://127.0.0.1:9000/ -d bar\n```\n\n```scala\nserver.logs.expect(POST).bodies(Set(\"foo\", \"bar\"))(1.second)  // (PASS)\nserver.logs.expect(POST).bodies(Set(\"bar\", \"foo\"))(1.second)  // (PASS)\nserver.logs.expect(POST).bodies(Set(\"foo\", \"XXX\"))(1.second)  // java.lang.AssertionError\n\nserver.stop()\n```\n\n#### using in Spec\n\n```scala\nimport sc.ala.http.mock._\nimport scala.concurrent.duration._\nimport org.scalatest.FunSpec\n\nclass FooSpec extends FunSpec {\n  describe(\"foo\") {\n    it(\"test with real httpd\") {\n      HttpMock.run { server =\u003e\n        // your application logic to `server.url`\n        ...\n\n        // assert your requests like this\n        server.logs.expect(POST, count = 2)(3.seconds)\n      }\n    }\n  }\n}\n```\n\n\nTODO\n====\n\n#### Expectations\n\n- support path, request parameters and request bodies\n\nLibrary\n=======\n\nSee [build.sbt](./build.sbt)\n\nRelease\n=======\n\n```shell\n% sbt\n\u003e + compile\n\u003e + publishSigned\n\u003e + sonatypeRelease\n```\n\nIf you got `Unable to find credentials` in `publishSigned` phase,\nit might have to do with credentials at `~/.sbt/0.13/sonatype.sbt`.\n\n```\n[error] Unable to find credentials for [Sonatype Nexus Repository Manager @ oss.sonatype.org].\n[trace] Stack trace suppressed: run last *:publishSigned for the full output.\n[error] (*:publishSigned) java.io.IOException: Access to URL https://oss.sonatype.org/service/local/staging/deploy/maven2/sc/ala/http-mock_2.11/0.3.3/http-mock_2.11-0.3.3-javadoc.jar was refused by the server: Unauthorized\n```\n\nSee: http://www.scala-sbt.org/release/docs/Using-Sonatype.html\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaiha%2Fhttp-mock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaiha%2Fhttp-mock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaiha%2Fhttp-mock/lists"}