Repository files navigation

MockServer Python Client

Build Status

Python client to James D. Bloom's awesome MockServer : http://www.mock-server.com/

Philosophy

Tests should be readable and Mock Server is already very complete and customizable. This library tries to keep it simple and straight-forward using python's kwargs to avoid big declarations.

We think a mock should be able to fit into one 120 char line of code should the expectation be simple enough :)

client.stub(request(method="GET", path="/auth"), response(code=401, body="unauthorized"))

Installation

WARNING: THIS IS A VERY EARLY VERSION THE API IS MOST LIKELY TO CHANGE

From source:

git clone https://github.com/internap/python-mockserver-friendly-client.git
cd python-mockserver-friendly-client
python setup.py install

From PyPi directly:

pip install mockserver-friendly-client

Prerequisite

You need a running MockServer running, see http://www.mock-server.com/mock_server/getting_started.html#start_mockserver

This project's tests uses the docker image : https://github.com/internap/python-mockserver-friendly-client/blob/master/docker-compose.yml

Usage

The whole Mock Server API is not all covered. We just implemented what we needed, if you need something not yet implemented you can open an issue and/or contribute

Stubbing

(For when you are testing what your code DOES with another component's data)

from mockserver import MockServerClient, request, response
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="GET", path="/that/thing", querystring={"is": "good"}, headers={"so": "good"}),
response(code=418, body="i'm a teapot", headers={"hi": "haa"})
)
  • You can also add a times(N) as a third parameter to limit how many times this stub can be called, default is unlimited
  • All parameters are always optional. When not specified, the match everything.

Expecting

(For when calling another component IS what you are testing)

Using the expect will remember the request and verify it when verify_expectations is called.

import json
from mockserver import MockServerClient, request, response, times
client = MockServerClient("http://localhost:1080")
client.expect(
request(method="POST", path="/postme", body=json.dumps({"some": "json"})),
response(code=204, body=json.dumps({"return": "something"}), headers={"Content-Type": "application/json"}),
times(1)
)
client.verify_expectations() # AssertionError !
  • The times(N) parameter is mandatory for expect

Resetting

(Because tests shouldn't impact each other)

from mockserver import MockServerClient
client = MockServerClient("http://localhost:1080")
client.reset()

Customizing and shortcuts

This client consumes Mock Server's REST API : https://app.swaggerhub.com/apis/jamesdbloom/mock-server-openapi

Here's a few shortcuts already ready, there may be more to come

Mocking a form post

from mockserver import MockServerClient, request, response, form
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="POST", body=form({"user": "foo", "pass": "bar"})),
response(code=201)
)

This currently takes a 1 level dict. For array mocking, use {"key[index]": "value"}

Returning JSON

from mockserver import MockServerClient, request, json_response
client = MockServerClient("http://localhost:1080")
client.stub(
request(path="/stuff"),
json_response(code=200, body={"full": "json", "structure": ["with", "stuff", 1]})
)

This automatically dumps the body in json and appends the application/json Content-Type to the headers.

Expecting JSON request

from mockserver import MockServerClient, request, json_equals
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_equals({"key": "value"})),
response(),
times(1)
)

This only matches requests with the provided json body. Json conversation is done automatically. If you only want to match parts of a given JSON you can provide only the matching parts using json_contains:

from mockserver import MockServerClient, request, json_contains
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_contains({"key": "value"})),
response(),
times(1)
)

I.e. this will match {"key": "value"} or {"key": "value", "another": "key"}

Verifying request

from mockserver import MockServerClient, request, times
client = MockServerClient("http://localhost:1080")
client.verify(
request(path="/some_path", querystring({"key": "value"})),
times(1)
)

Verify will check request on MockServer and raise AssertionError if request not found.

More documentation

There is currently no official documentation, however you can consider the tests as a type of documentation, they are pretty explicit and simple to follow and help to clarify the purpose of each feature.

Good practices

Having your test setup/teardown like this is probably a good idea.

class ServerMockingTestBase(...):
def setUp(self):
super(ServerMockingTestBase, self).setUp()
self.client = MockServerClient(MOCK_SERVER_URL)
self.client.reset()
def tearDown(self):
super(ServerMockingTestBase, self).tearDown()
self.client.verify_expectations()

Troubleshooting

Checking MockServer's logs is the first place to go. If you don't see any logs, try another LOG_LEVEL such as INFO.

If the problem is in the code, please open an issue :)

Contributing

The form may not be final, we would love to hear what you think of the client!

Feel free to raise issues and send some pull request, we'll be happy to look at them!

Make sure all new code is tested, current tests run against a MockServer container.

Running tests

You can easily run the tests with https://pypi.python.org/pypi/tox

tox -e py34

You can also call the test-runner.sh directly, you will need https://pypi.python.org/pypi/nose installed

You can also launch the container

docker-compose up-d

and run the tests in your favorite IDE :)

About

Friendly python client to James D. Bloom's awesome MockServer

Resources

Stars

15 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

MockServer Python Client

Build Status

Python client to James D. Bloom's awesome MockServer : http://www.mock-server.com/

Philosophy

Tests should be readable and Mock Server is already very complete and customizable. This library tries to keep it simple and straight-forward using python's kwargs to avoid big declarations.

We think a mock should be able to fit into one 120 char line of code should the expectation be simple enough :)

client.stub(request(method="GET", path="/auth"), response(code=401, body="unauthorized"))

Installation

WARNING: THIS IS A VERY EARLY VERSION THE API IS MOST LIKELY TO CHANGE

From source:

git clone https://github.com/internap/python-mockserver-friendly-client.git
cd python-mockserver-friendly-client
python setup.py install

From PyPi directly:

pip install mockserver-friendly-client

Prerequisite

You need a running MockServer running, see http://www.mock-server.com/mock_server/getting_started.html#start_mockserver

This project's tests uses the docker image : https://github.com/internap/python-mockserver-friendly-client/blob/master/docker-compose.yml

Usage

The whole Mock Server API is not all covered. We just implemented what we needed, if you need something not yet implemented you can open an issue and/or contribute

Stubbing

(For when you are testing what your code DOES with another component's data)

from mockserver import MockServerClient, request, response
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="GET", path="/that/thing", querystring={"is": "good"}, headers={"so": "good"}),
response(code=418, body="i'm a teapot", headers={"hi": "haa"})
)
  • You can also add a times(N) as a third parameter to limit how many times this stub can be called, default is unlimited
  • All parameters are always optional. When not specified, the match everything.

Expecting

(For when calling another component IS what you are testing)

Using the expect will remember the request and verify it when verify_expectations is called.

import json
from mockserver import MockServerClient, request, response, times
client = MockServerClient("http://localhost:1080")
client.expect(
request(method="POST", path="/postme", body=json.dumps({"some": "json"})),
response(code=204, body=json.dumps({"return": "something"}), headers={"Content-Type": "application/json"}),
times(1)
)
client.verify_expectations() # AssertionError !
  • The times(N) parameter is mandatory for expect

Resetting

(Because tests shouldn't impact each other)

from mockserver import MockServerClient
client = MockServerClient("http://localhost:1080")
client.reset()

Customizing and shortcuts

This client consumes Mock Server's REST API : https://app.swaggerhub.com/apis/jamesdbloom/mock-server-openapi

Here's a few shortcuts already ready, there may be more to come

Mocking a form post

from mockserver import MockServerClient, request, response, form
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="POST", body=form({"user": "foo", "pass": "bar"})),
response(code=201)
)

This currently takes a 1 level dict. For array mocking, use {"key[index]": "value"}

Returning JSON

from mockserver import MockServerClient, request, json_response
client = MockServerClient("http://localhost:1080")
client.stub(
request(path="/stuff"),
json_response(code=200, body={"full": "json", "structure": ["with", "stuff", 1]})
)

This automatically dumps the body in json and appends the application/json Content-Type to the headers.

Expecting JSON request

from mockserver import MockServerClient, request, json_equals
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_equals({"key": "value"})),
response(),
times(1)
)

This only matches requests with the provided json body. Json conversation is done automatically. If you only want to match parts of a given JSON you can provide only the matching parts using json_contains:

from mockserver import MockServerClient, request, json_contains
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_contains({"key": "value"})),
response(),
times(1)
)

I.e. this will match {"key": "value"} or {"key": "value", "another": "key"}

Verifying request

from mockserver import MockServerClient, request, times
client = MockServerClient("http://localhost:1080")
client.verify(
request(path="/some_path", querystring({"key": "value"})),
times(1)
)

Verify will check request on MockServer and raise AssertionError if request not found.

More documentation

There is currently no official documentation, however you can consider the tests as a type of documentation, they are pretty explicit and simple to follow and help to clarify the purpose of each feature.

Good practices

Having your test setup/teardown like this is probably a good idea.

class ServerMockingTestBase(...):
def setUp(self):
super(ServerMockingTestBase, self).setUp()
self.client = MockServerClient(MOCK_SERVER_URL)
self.client.reset()
def tearDown(self):
super(ServerMockingTestBase, self).tearDown()
self.client.verify_expectations()

Troubleshooting

Checking MockServer's logs is the first place to go. If you don't see any logs, try another LOG_LEVEL such as INFO.

If the problem is in the code, please open an issue :)

Contributing

The form may not be final, we would love to hear what you think of the client!

Feel free to raise issues and send some pull request, we'll be happy to look at them!

Make sure all new code is tested, current tests run against a MockServer container.

Running tests

You can easily run the tests with https://pypi.python.org/pypi/tox

tox -e py34

You can also call the test-runner.sh directly, you will need https://pypi.python.org/pypi/nose installed

You can also launch the container

docker-compose up-d

and run the tests in your favorite IDE :)

About

Friendly python client to James D. Bloom's awesome MockServer

Resources

Stars

15 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MockServer Python Client

Build Status

Python client to James D. Bloom's awesome MockServer : http://www.mock-server.com/

Philosophy

Tests should be readable and Mock Server is already very complete and customizable. This library tries to keep it simple and straight-forward using python's kwargs to avoid big declarations.

We think a mock should be able to fit into one 120 char line of code should the expectation be simple enough :)

client.stub(request(method="GET", path="/auth"), response(code=401, body="unauthorized"))

Installation

WARNING: THIS IS A VERY EARLY VERSION THE API IS MOST LIKELY TO CHANGE

From source:

git clone https://github.com/internap/python-mockserver-friendly-client.git
cd python-mockserver-friendly-client
python setup.py install

From PyPi directly:

pip install mockserver-friendly-client

Prerequisite

You need a running MockServer running, see http://www.mock-server.com/mock_server/getting_started.html#start_mockserver

This project's tests uses the docker image : https://github.com/internap/python-mockserver-friendly-client/blob/master/docker-compose.yml

Usage

The whole Mock Server API is not all covered. We just implemented what we needed, if you need something not yet implemented you can open an issue and/or contribute

Stubbing

(For when you are testing what your code DOES with another component's data)

from mockserver import MockServerClient, request, response
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="GET", path="/that/thing", querystring={"is": "good"}, headers={"so": "good"}),
response(code=418, body="i'm a teapot", headers={"hi": "haa"})
)
  • You can also add a times(N) as a third parameter to limit how many times this stub can be called, default is unlimited
  • All parameters are always optional. When not specified, the match everything.

Expecting

(For when calling another component IS what you are testing)

Using the expect will remember the request and verify it when verify_expectations is called.

import json
from mockserver import MockServerClient, request, response, times
client = MockServerClient("http://localhost:1080")
client.expect(
request(method="POST", path="/postme", body=json.dumps({"some": "json"})),
response(code=204, body=json.dumps({"return": "something"}), headers={"Content-Type": "application/json"}),
times(1)
)
client.verify_expectations() # AssertionError !
  • The times(N) parameter is mandatory for expect

Resetting

(Because tests shouldn't impact each other)

from mockserver import MockServerClient
client = MockServerClient("http://localhost:1080")
client.reset()

Customizing and shortcuts

This client consumes Mock Server's REST API : https://app.swaggerhub.com/apis/jamesdbloom/mock-server-openapi

Here's a few shortcuts already ready, there may be more to come

Mocking a form post

from mockserver import MockServerClient, request, response, form
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="POST", body=form({"user": "foo", "pass": "bar"})),
response(code=201)
)

This currently takes a 1 level dict. For array mocking, use {"key[index]": "value"}

Returning JSON

from mockserver import MockServerClient, request, json_response
client = MockServerClient("http://localhost:1080")
client.stub(
request(path="/stuff"),
json_response(code=200, body={"full": "json", "structure": ["with", "stuff", 1]})
)

This automatically dumps the body in json and appends the application/json Content-Type to the headers.

Expecting JSON request

from mockserver import MockServerClient, request, json_equals
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_equals({"key": "value"})),
response(),
times(1)
)

This only matches requests with the provided json body. Json conversation is done automatically. If you only want to match parts of a given JSON you can provide only the matching parts using json_contains:

from mockserver import MockServerClient, request, json_contains
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_contains({"key": "value"})),
response(),
times(1)
)

I.e. this will match {"key": "value"} or {"key": "value", "another": "key"}

Verifying request

from mockserver import MockServerClient, request, times
client = MockServerClient("http://localhost:1080")
client.verify(
request(path="/some_path", querystring({"key": "value"})),
times(1)
)

Verify will check request on MockServer and raise AssertionError if request not found.

More documentation

There is currently no official documentation, however you can consider the tests as a type of documentation, they are pretty explicit and simple to follow and help to clarify the purpose of each feature.

Good practices

Having your test setup/teardown like this is probably a good idea.

class ServerMockingTestBase(...):
def setUp(self):
super(ServerMockingTestBase, self).setUp()
self.client = MockServerClient(MOCK_SERVER_URL)
self.client.reset()
def tearDown(self):
super(ServerMockingTestBase, self).tearDown()
self.client.verify_expectations()

Troubleshooting

Checking MockServer's logs is the first place to go. If you don't see any logs, try another LOG_LEVEL such as INFO.

If the problem is in the code, please open an issue :)

Contributing

The form may not be final, we would love to hear what you think of the client!

Feel free to raise issues and send some pull request, we'll be happy to look at them!

Make sure all new code is tested, current tests run against a MockServer container.

Running tests

You can easily run the tests with https://pypi.python.org/pypi/tox

tox -e py34

You can also call the test-runner.sh directly, you will need https://pypi.python.org/pypi/nose installed

You can also launch the container

docker-compose up-d

and run the tests in your favorite IDE :)

About

Friendly python client to James D. Bloom's awesome MockServer

Resources

Stars

15 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MockServer Python Client

Build Status

Python client to James D. Bloom's awesome MockServer : http://www.mock-server.com/

Philosophy

Tests should be readable and Mock Server is already very complete and customizable. This library tries to keep it simple and straight-forward using python's kwargs to avoid big declarations.

We think a mock should be able to fit into one 120 char line of code should the expectation be simple enough :)

client.stub(request(method="GET", path="/auth"), response(code=401, body="unauthorized"))

Installation

WARNING: THIS IS A VERY EARLY VERSION THE API IS MOST LIKELY TO CHANGE

From source:

git clone https://github.com/internap/python-mockserver-friendly-client.git
cd python-mockserver-friendly-client
python setup.py install

From PyPi directly:

pip install mockserver-friendly-client

Prerequisite

You need a running MockServer running, see http://www.mock-server.com/mock_server/getting_started.html#start_mockserver

This project's tests uses the docker image : https://github.com/internap/python-mockserver-friendly-client/blob/master/docker-compose.yml

Usage

The whole Mock Server API is not all covered. We just implemented what we needed, if you need something not yet implemented you can open an issue and/or contribute

Stubbing

(For when you are testing what your code DOES with another component's data)

from mockserver import MockServerClient, request, response
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="GET", path="/that/thing", querystring={"is": "good"}, headers={"so": "good"}),
response(code=418, body="i'm a teapot", headers={"hi": "haa"})
)
  • You can also add a times(N) as a third parameter to limit how many times this stub can be called, default is unlimited
  • All parameters are always optional. When not specified, the match everything.

Expecting

(For when calling another component IS what you are testing)

Using the expect will remember the request and verify it when verify_expectations is called.

import json
from mockserver import MockServerClient, request, response, times
client = MockServerClient("http://localhost:1080")
client.expect(
request(method="POST", path="/postme", body=json.dumps({"some": "json"})),
response(code=204, body=json.dumps({"return": "something"}), headers={"Content-Type": "application/json"}),
times(1)
)
client.verify_expectations() # AssertionError !
  • The times(N) parameter is mandatory for expect

Resetting

(Because tests shouldn't impact each other)

from mockserver import MockServerClient
client = MockServerClient("http://localhost:1080")
client.reset()

Customizing and shortcuts

This client consumes Mock Server's REST API : https://app.swaggerhub.com/apis/jamesdbloom/mock-server-openapi

Here's a few shortcuts already ready, there may be more to come

Mocking a form post

from mockserver import MockServerClient, request, response, form
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="POST", body=form({"user": "foo", "pass": "bar"})),
response(code=201)
)

This currently takes a 1 level dict. For array mocking, use {"key[index]": "value"}

Returning JSON

from mockserver import MockServerClient, request, json_response
client = MockServerClient("http://localhost:1080")
client.stub(
request(path="/stuff"),
json_response(code=200, body={"full": "json", "structure": ["with", "stuff", 1]})
)

This automatically dumps the body in json and appends the application/json Content-Type to the headers.

Expecting JSON request

from mockserver import MockServerClient, request, json_equals
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_equals({"key": "value"})),
response(),
times(1)
)

This only matches requests with the provided json body. Json conversation is done automatically. If you only want to match parts of a given JSON you can provide only the matching parts using json_contains:

from mockserver import MockServerClient, request, json_contains
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_contains({"key": "value"})),
response(),
times(1)
)

I.e. this will match {"key": "value"} or {"key": "value", "another": "key"}

Verifying request

from mockserver import MockServerClient, request, times
client = MockServerClient("http://localhost:1080")
client.verify(
request(path="/some_path", querystring({"key": "value"})),
times(1)
)

Verify will check request on MockServer and raise AssertionError if request not found.

More documentation

There is currently no official documentation, however you can consider the tests as a type of documentation, they are pretty explicit and simple to follow and help to clarify the purpose of each feature.

Good practices

Having your test setup/teardown like this is probably a good idea.

class ServerMockingTestBase(...):
def setUp(self):
super(ServerMockingTestBase, self).setUp()
self.client = MockServerClient(MOCK_SERVER_URL)
self.client.reset()
def tearDown(self):
super(ServerMockingTestBase, self).tearDown()
self.client.verify_expectations()

Troubleshooting

Checking MockServer's logs is the first place to go. If you don't see any logs, try another LOG_LEVEL such as INFO.

If the problem is in the code, please open an issue :)

Contributing

The form may not be final, we would love to hear what you think of the client!

Feel free to raise issues and send some pull request, we'll be happy to look at them!

Make sure all new code is tested, current tests run against a MockServer container.

Running tests

You can easily run the tests with https://pypi.python.org/pypi/tox

tox -e py34

You can also call the test-runner.sh directly, you will need https://pypi.python.org/pypi/nose installed

You can also launch the container

docker-compose up-d

and run the tests in your favorite IDE :)

About

Friendly python client to James D. Bloom's awesome MockServer

Resources

Stars

15 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

MockServer Python Client

Build Status

Python client to James D. Bloom's awesome MockServer : http://www.mock-server.com/

Philosophy

Tests should be readable and Mock Server is already very complete and customizable. This library tries to keep it simple and straight-forward using python's kwargs to avoid big declarations.

We think a mock should be able to fit into one 120 char line of code should the expectation be simple enough :)

client.stub(request(method="GET", path="/auth"), response(code=401, body="unauthorized"))

Installation

WARNING: THIS IS A VERY EARLY VERSION THE API IS MOST LIKELY TO CHANGE

From source:

git clone https://github.com/internap/python-mockserver-friendly-client.git
cd python-mockserver-friendly-client
python setup.py install

From PyPi directly:

pip install mockserver-friendly-client

Prerequisite

You need a running MockServer running, see http://www.mock-server.com/mock_server/getting_started.html#start_mockserver

This project's tests uses the docker image : https://github.com/internap/python-mockserver-friendly-client/blob/master/docker-compose.yml

Usage

The whole Mock Server API is not all covered. We just implemented what we needed, if you need something not yet implemented you can open an issue and/or contribute

Stubbing

(For when you are testing what your code DOES with another component's data)

from mockserver import MockServerClient, request, response
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="GET", path="/that/thing", querystring={"is": "good"}, headers={"so": "good"}),
response(code=418, body="i'm a teapot", headers={"hi": "haa"})
)
  • You can also add a times(N) as a third parameter to limit how many times this stub can be called, default is unlimited
  • All parameters are always optional. When not specified, the match everything.

Expecting

(For when calling another component IS what you are testing)

Using the expect will remember the request and verify it when verify_expectations is called.

import json
from mockserver import MockServerClient, request, response, times
client = MockServerClient("http://localhost:1080")
client.expect(
request(method="POST", path="/postme", body=json.dumps({"some": "json"})),
response(code=204, body=json.dumps({"return": "something"}), headers={"Content-Type": "application/json"}),
times(1)
)
client.verify_expectations() # AssertionError !
  • The times(N) parameter is mandatory for expect

Resetting

(Because tests shouldn't impact each other)

from mockserver import MockServerClient
client = MockServerClient("http://localhost:1080")
client.reset()

Customizing and shortcuts

This client consumes Mock Server's REST API : https://app.swaggerhub.com/apis/jamesdbloom/mock-server-openapi

Here's a few shortcuts already ready, there may be more to come

Mocking a form post

from mockserver import MockServerClient, request, response, form
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="POST", body=form({"user": "foo", "pass": "bar"})),
response(code=201)
)

This currently takes a 1 level dict. For array mocking, use {"key[index]": "value"}

Returning JSON

from mockserver import MockServerClient, request, json_response
client = MockServerClient("http://localhost:1080")
client.stub(
request(path="/stuff"),
json_response(code=200, body={"full": "json", "structure": ["with", "stuff", 1]})
)

This automatically dumps the body in json and appends the application/json Content-Type to the headers.

Expecting JSON request

from mockserver import MockServerClient, request, json_equals
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_equals({"key": "value"})),
response(),
times(1)
)

This only matches requests with the provided json body. Json conversation is done automatically. If you only want to match parts of a given JSON you can provide only the matching parts using json_contains:

from mockserver import MockServerClient, request, json_contains
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_contains({"key": "value"})),
response(),
times(1)
)

I.e. this will match {"key": "value"} or {"key": "value", "another": "key"}

Verifying request

from mockserver import MockServerClient, request, times
client = MockServerClient("http://localhost:1080")
client.verify(
request(path="/some_path", querystring({"key": "value"})),
times(1)
)

Verify will check request on MockServer and raise AssertionError if request not found.

More documentation

There is currently no official documentation, however you can consider the tests as a type of documentation, they are pretty explicit and simple to follow and help to clarify the purpose of each feature.

Good practices

Having your test setup/teardown like this is probably a good idea.

class ServerMockingTestBase(...):
def setUp(self):
super(ServerMockingTestBase, self).setUp()
self.client = MockServerClient(MOCK_SERVER_URL)
self.client.reset()
def tearDown(self):
super(ServerMockingTestBase, self).tearDown()
self.client.verify_expectations()

Troubleshooting

Checking MockServer's logs is the first place to go. If you don't see any logs, try another LOG_LEVEL such as INFO.

If the problem is in the code, please open an issue :)

Contributing

The form may not be final, we would love to hear what you think of the client!

Feel free to raise issues and send some pull request, we'll be happy to look at them!

Make sure all new code is tested, current tests run against a MockServer container.

Running tests

You can easily run the tests with https://pypi.python.org/pypi/tox

tox -e py34

You can also call the test-runner.sh directly, you will need https://pypi.python.org/pypi/nose installed

You can also launch the container

docker-compose up-d

and run the tests in your favorite IDE :)

About

Friendly python client to James D. Bloom's awesome MockServer

Resources

Stars

15 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MockServer Python Client

Build Status

Python client to James D. Bloom's awesome MockServer : http://www.mock-server.com/

Philosophy

Tests should be readable and Mock Server is already very complete and customizable. This library tries to keep it simple and straight-forward using python's kwargs to avoid big declarations.

We think a mock should be able to fit into one 120 char line of code should the expectation be simple enough :)

client.stub(request(method="GET", path="/auth"), response(code=401, body="unauthorized"))

Installation

WARNING: THIS IS A VERY EARLY VERSION THE API IS MOST LIKELY TO CHANGE

From source:

git clone https://github.com/internap/python-mockserver-friendly-client.git
cd python-mockserver-friendly-client
python setup.py install

From PyPi directly:

pip install mockserver-friendly-client

Prerequisite

You need a running MockServer running, see http://www.mock-server.com/mock_server/getting_started.html#start_mockserver

This project's tests uses the docker image : https://github.com/internap/python-mockserver-friendly-client/blob/master/docker-compose.yml

Usage

The whole Mock Server API is not all covered. We just implemented what we needed, if you need something not yet implemented you can open an issue and/or contribute

Stubbing

(For when you are testing what your code DOES with another component's data)

from mockserver import MockServerClient, request, response
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="GET", path="/that/thing", querystring={"is": "good"}, headers={"so": "good"}),
response(code=418, body="i'm a teapot", headers={"hi": "haa"})
)
  • You can also add a times(N) as a third parameter to limit how many times this stub can be called, default is unlimited
  • All parameters are always optional. When not specified, the match everything.

Expecting

(For when calling another component IS what you are testing)

Using the expect will remember the request and verify it when verify_expectations is called.

import json
from mockserver import MockServerClient, request, response, times
client = MockServerClient("http://localhost:1080")
client.expect(
request(method="POST", path="/postme", body=json.dumps({"some": "json"})),
response(code=204, body=json.dumps({"return": "something"}), headers={"Content-Type": "application/json"}),
times(1)
)
client.verify_expectations() # AssertionError !
  • The times(N) parameter is mandatory for expect

Resetting

(Because tests shouldn't impact each other)

from mockserver import MockServerClient
client = MockServerClient("http://localhost:1080")
client.reset()

Customizing and shortcuts

This client consumes Mock Server's REST API : https://app.swaggerhub.com/apis/jamesdbloom/mock-server-openapi

Here's a few shortcuts already ready, there may be more to come

Mocking a form post

from mockserver import MockServerClient, request, response, form
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="POST", body=form({"user": "foo", "pass": "bar"})),
response(code=201)
)

This currently takes a 1 level dict. For array mocking, use {"key[index]": "value"}

Returning JSON

from mockserver import MockServerClient, request, json_response
client = MockServerClient("http://localhost:1080")
client.stub(
request(path="/stuff"),
json_response(code=200, body={"full": "json", "structure": ["with", "stuff", 1]})
)

This automatically dumps the body in json and appends the application/json Content-Type to the headers.

Expecting JSON request

from mockserver import MockServerClient, request, json_equals
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_equals({"key": "value"})),
response(),
times(1)
)

This only matches requests with the provided json body. Json conversation is done automatically. If you only want to match parts of a given JSON you can provide only the matching parts using json_contains:

from mockserver import MockServerClient, request, json_contains
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_contains({"key": "value"})),
response(),
times(1)
)

I.e. this will match {"key": "value"} or {"key": "value", "another": "key"}

Verifying request

from mockserver import MockServerClient, request, times
client = MockServerClient("http://localhost:1080")
client.verify(
request(path="/some_path", querystring({"key": "value"})),
times(1)
)

Verify will check request on MockServer and raise AssertionError if request not found.

More documentation

There is currently no official documentation, however you can consider the tests as a type of documentation, they are pretty explicit and simple to follow and help to clarify the purpose of each feature.

Good practices

Having your test setup/teardown like this is probably a good idea.

class ServerMockingTestBase(...):
def setUp(self):
super(ServerMockingTestBase, self).setUp()
self.client = MockServerClient(MOCK_SERVER_URL)
self.client.reset()
def tearDown(self):
super(ServerMockingTestBase, self).tearDown()
self.client.verify_expectations()

Troubleshooting

Checking MockServer's logs is the first place to go. If you don't see any logs, try another LOG_LEVEL such as INFO.

If the problem is in the code, please open an issue :)

Contributing

The form may not be final, we would love to hear what you think of the client!

Feel free to raise issues and send some pull request, we'll be happy to look at them!

Make sure all new code is tested, current tests run against a MockServer container.

Running tests

You can easily run the tests with https://pypi.python.org/pypi/tox

tox -e py34

You can also call the test-runner.sh directly, you will need https://pypi.python.org/pypi/nose installed

You can also launch the container

docker-compose up-d

and run the tests in your favorite IDE :)

About

Friendly python client to James D. Bloom's awesome MockServer

Resources

Stars

15 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MockServer Python Client

Build Status

Python client to James D. Bloom's awesome MockServer : http://www.mock-server.com/

Philosophy

Tests should be readable and Mock Server is already very complete and customizable. This library tries to keep it simple and straight-forward using python's kwargs to avoid big declarations.

We think a mock should be able to fit into one 120 char line of code should the expectation be simple enough :)

client.stub(request(method="GET", path="/auth"), response(code=401, body="unauthorized"))

Installation

WARNING: THIS IS A VERY EARLY VERSION THE API IS MOST LIKELY TO CHANGE

From source:

git clone https://github.com/internap/python-mockserver-friendly-client.git
cd python-mockserver-friendly-client
python setup.py install

From PyPi directly:

pip install mockserver-friendly-client

Prerequisite

You need a running MockServer running, see http://www.mock-server.com/mock_server/getting_started.html#start_mockserver

This project's tests uses the docker image : https://github.com/internap/python-mockserver-friendly-client/blob/master/docker-compose.yml

Usage

The whole Mock Server API is not all covered. We just implemented what we needed, if you need something not yet implemented you can open an issue and/or contribute

Stubbing

(For when you are testing what your code DOES with another component's data)

from mockserver import MockServerClient, request, response
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="GET", path="/that/thing", querystring={"is": "good"}, headers={"so": "good"}),
response(code=418, body="i'm a teapot", headers={"hi": "haa"})
)
  • You can also add a times(N) as a third parameter to limit how many times this stub can be called, default is unlimited
  • All parameters are always optional. When not specified, the match everything.

Expecting

(For when calling another component IS what you are testing)

Using the expect will remember the request and verify it when verify_expectations is called.

import json
from mockserver import MockServerClient, request, response, times
client = MockServerClient("http://localhost:1080")
client.expect(
request(method="POST", path="/postme", body=json.dumps({"some": "json"})),
response(code=204, body=json.dumps({"return": "something"}), headers={"Content-Type": "application/json"}),
times(1)
)
client.verify_expectations() # AssertionError !
  • The times(N) parameter is mandatory for expect

Resetting

(Because tests shouldn't impact each other)

from mockserver import MockServerClient
client = MockServerClient("http://localhost:1080")
client.reset()

Customizing and shortcuts

This client consumes Mock Server's REST API : https://app.swaggerhub.com/apis/jamesdbloom/mock-server-openapi

Here's a few shortcuts already ready, there may be more to come

Mocking a form post

from mockserver import MockServerClient, request, response, form
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="POST", body=form({"user": "foo", "pass": "bar"})),
response(code=201)
)

This currently takes a 1 level dict. For array mocking, use {"key[index]": "value"}

Returning JSON

from mockserver import MockServerClient, request, json_response
client = MockServerClient("http://localhost:1080")
client.stub(
request(path="/stuff"),
json_response(code=200, body={"full": "json", "structure": ["with", "stuff", 1]})
)

This automatically dumps the body in json and appends the application/json Content-Type to the headers.

Expecting JSON request

from mockserver import MockServerClient, request, json_equals
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_equals({"key": "value"})),
response(),
times(1)
)

This only matches requests with the provided json body. Json conversation is done automatically. If you only want to match parts of a given JSON you can provide only the matching parts using json_contains:

from mockserver import MockServerClient, request, json_contains
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_contains({"key": "value"})),
response(),
times(1)
)

I.e. this will match {"key": "value"} or {"key": "value", "another": "key"}

Verifying request

from mockserver import MockServerClient, request, times
client = MockServerClient("http://localhost:1080")
client.verify(
request(path="/some_path", querystring({"key": "value"})),
times(1)
)

Verify will check request on MockServer and raise AssertionError if request not found.

More documentation

There is currently no official documentation, however you can consider the tests as a type of documentation, they are pretty explicit and simple to follow and help to clarify the purpose of each feature.

Good practices

Having your test setup/teardown like this is probably a good idea.

class ServerMockingTestBase(...):
def setUp(self):
super(ServerMockingTestBase, self).setUp()
self.client = MockServerClient(MOCK_SERVER_URL)
self.client.reset()
def tearDown(self):
super(ServerMockingTestBase, self).tearDown()
self.client.verify_expectations()

Troubleshooting

Checking MockServer's logs is the first place to go. If you don't see any logs, try another LOG_LEVEL such as INFO.

If the problem is in the code, please open an issue :)

Contributing

The form may not be final, we would love to hear what you think of the client!

Feel free to raise issues and send some pull request, we'll be happy to look at them!

Make sure all new code is tested, current tests run against a MockServer container.

Running tests

You can easily run the tests with https://pypi.python.org/pypi/tox

tox -e py34

You can also call the test-runner.sh directly, you will need https://pypi.python.org/pypi/nose installed

You can also launch the container

docker-compose up-d

and run the tests in your favorite IDE :)

About

Friendly python client to James D. Bloom's awesome MockServer

Resources

Stars

15 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

MockServer Python Client

Build Status

Python client to James D. Bloom's awesome MockServer : http://www.mock-server.com/

Philosophy

Tests should be readable and Mock Server is already very complete and customizable. This library tries to keep it simple and straight-forward using python's kwargs to avoid big declarations.

We think a mock should be able to fit into one 120 char line of code should the expectation be simple enough :)

client.stub(request(method="GET", path="/auth"), response(code=401, body="unauthorized"))

Installation

WARNING: THIS IS A VERY EARLY VERSION THE API IS MOST LIKELY TO CHANGE

From source:

git clone https://github.com/internap/python-mockserver-friendly-client.git
cd python-mockserver-friendly-client
python setup.py install

From PyPi directly:

pip install mockserver-friendly-client

Prerequisite

You need a running MockServer running, see http://www.mock-server.com/mock_server/getting_started.html#start_mockserver

This project's tests uses the docker image : https://github.com/internap/python-mockserver-friendly-client/blob/master/docker-compose.yml

Usage

The whole Mock Server API is not all covered. We just implemented what we needed, if you need something not yet implemented you can open an issue and/or contribute

Stubbing

(For when you are testing what your code DOES with another component's data)

from mockserver import MockServerClient, request, response
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="GET", path="/that/thing", querystring={"is": "good"}, headers={"so": "good"}),
response(code=418, body="i'm a teapot", headers={"hi": "haa"})
)
  • You can also add a times(N) as a third parameter to limit how many times this stub can be called, default is unlimited
  • All parameters are always optional. When not specified, the match everything.

Expecting

(For when calling another component IS what you are testing)

Using the expect will remember the request and verify it when verify_expectations is called.

import json
from mockserver import MockServerClient, request, response, times
client = MockServerClient("http://localhost:1080")
client.expect(
request(method="POST", path="/postme", body=json.dumps({"some": "json"})),
response(code=204, body=json.dumps({"return": "something"}), headers={"Content-Type": "application/json"}),
times(1)
)
client.verify_expectations() # AssertionError !
  • The times(N) parameter is mandatory for expect

Resetting

(Because tests shouldn't impact each other)

from mockserver import MockServerClient
client = MockServerClient("http://localhost:1080")
client.reset()

Customizing and shortcuts

This client consumes Mock Server's REST API : https://app.swaggerhub.com/apis/jamesdbloom/mock-server-openapi

Here's a few shortcuts already ready, there may be more to come

Mocking a form post

from mockserver import MockServerClient, request, response, form
client = MockServerClient("http://localhost:1080")
client.stub(
request(method="POST", body=form({"user": "foo", "pass": "bar"})),
response(code=201)
)

This currently takes a 1 level dict. For array mocking, use {"key[index]": "value"}

Returning JSON

from mockserver import MockServerClient, request, json_response
client = MockServerClient("http://localhost:1080")
client.stub(
request(path="/stuff"),
json_response(code=200, body={"full": "json", "structure": ["with", "stuff", 1]})
)

This automatically dumps the body in json and appends the application/json Content-Type to the headers.

Expecting JSON request

from mockserver import MockServerClient, request, json_equals
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_equals({"key": "value"})),
response(),
times(1)
)

This only matches requests with the provided json body. Json conversation is done automatically. If you only want to match parts of a given JSON you can provide only the matching parts using json_contains:

from mockserver import MockServerClient, request, json_contains
client = MockServerClient("http://localhost:1080")
client.expect(
request(body=json_contains({"key": "value"})),
response(),
times(1)
)

I.e. this will match {"key": "value"} or {"key": "value", "another": "key"}

Verifying request

from mockserver import MockServerClient, request, times
client = MockServerClient("http://localhost:1080")
client.verify(
request(path="/some_path", querystring({"key": "value"})),
times(1)
)

Verify will check request on MockServer and raise AssertionError if request not found.

More documentation

There is currently no official documentation, however you can consider the tests as a type of documentation, they are pretty explicit and simple to follow and help to clarify the purpose of each feature.

Good practices

Having your test setup/teardown like this is probably a good idea.

class ServerMockingTestBase(...):
def setUp(self):
super(ServerMockingTestBase, self).setUp()
self.client = MockServerClient(MOCK_SERVER_URL)
self.client.reset()
def tearDown(self):
super(ServerMockingTestBase, self).tearDown()
self.client.verify_expectations()

Troubleshooting

Checking MockServer's logs is the first place to go. If you don't see any logs, try another LOG_LEVEL such as INFO.

If the problem is in the code, please open an issue :)

Contributing

The form may not be final, we would love to hear what you think of the client!

Feel free to raise issues and send some pull request, we'll be happy to look at them!

Make sure all new code is tested, current tests run against a MockServer container.

Running tests

You can easily run the tests with https://pypi.python.org/pypi/tox

tox -e py34

You can also call the test-runner.sh directly, you will need https://pypi.python.org/pypi/nose installed

You can also launch the container

docker-compose up-d

and run the tests in your favorite IDE :)

About

Friendly python client to James D. Bloom's awesome MockServer

Resources

Stars

15 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages