Development
Serving Docs Locally
Requirements:
Install Doc Dependencies
npm run docs-install
Serve Docs
npm run docs-start
Developing/Testing Github Actions
Use act to run Github actions locally.
An example secrets file can be found in the project working directory at act.env.example
Modify push-hook-sample.json to point to the local branch you want to run a push
event trigger on, then run this command from the project working directory:
act -e .github/push-hook-sample.json --secret-file act.env
Mocking Reddit API
Using MockServer
Installation
https://www.mock-server.com/mock_server/running_mock_server.html
Easiest way is to install the docker container (from here)
Map port 1080:1080
– acts as both the proxy port and the UI endpoint with the below URL:
http(s)://localhost:1080/mockserver/dashboard
In your operator configuration define a proxy for snoowrap at the top-level:
snoowrap:
proxy: 'http://localhost:8010'
#debug: true # optionally set debug to true to make snoowrap requests output to log
Usage
Forwarding Requests (Monitoring Behavior)
This is what will make MockServer act as an actual proxy server. In this state CM will operate normally. In the MockServer UI you will be able to monitor all requests/responses made.
PUT /mockserver/expectation HTTP/1.1
Host: localhost:8010
Content-Type: application/json
Content-Length: 155
{
"httpRequest": {},
"priority": 0,
"httpForward": {
"host": "oauth.reddit.com",
"port": 443,
"scheme": "HTTPS"
}
}
CURL
curl --location --request PUT 'http://localhost:8010/mockserver/expectation' \
--header 'Content-Type: application/json' \
--data-raw '{
"httpRequest": {},
"priority": 0,
"httpForward": {
"host": "oauth.reddit.com",
"port": 443,
"scheme": "HTTPS"
}
}'
Mocking Network Issues
MockServer is a bit confusing and regex’ing for specific paths don’t work well (for me??)
The lifecycle of a mock call I do:
- Make sure forwarding is set, to begin with
- Breakpoint before the code you want to test with mocking
- Mock the network issue
- Once the mock behavior should be “done” then
- Clear all exceptions
- Set forwarding behavior again
Create Network Issue Behavior
All Responses return 403
HTTP
PUT /mockserver/expectation HTTP/1.1
Host: localhost:8010
Content-Type: application/json
Content-Length: 1757
{
"id": "error",
"httpRequest": {
"path": ".*"
},
"priority": 1,
"httpResponse": {
"statusCode": 403,
"reasonPhrase": "Forbidden",
"headers": {
"Connection": [
"keep-alive"
],
"Content-Type": [
"application/json; charset=UTF-8"
],
"x-ua-compatible": [
"IE=edge"
],
"x-frame-options": [
"SAMEORIGIN"
],
"x-content-type-options": [
"nosniff"
],
"x-xss-protection": [
"1; mode=block"
],
"expires": [
"-1"
],
"cache-control": [
"private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
],
"x-ratelimit-remaining": [
"575.0"
],
"x-ratelimit-used": [
"25"
],
"x-ratelimit-reset": [
"143"
],
"X-Moose": [
"majestic"
],
"Accept-Ranges": [
"bytes"
],
"Date": [
"Wed, 05 Jan 2022 14:37:37 GMT"
],
"Via": [
"1.1 varnish"
],
"Vary": [
"accept-encoding"
],
"Strict-Transport-Security": [
"max-age=15552000; includeSubDomains; preload"
],
"Server": [
"snooserv"
],
"X-Clacks-Overhead": [
"GNU Terry Pratchett"
]
}
}
}
CURL
curl --location --request PUT 'http://localhost:8010/mockserver/expectation' \
--header 'Content-Type: application/json' \
--data-raw '{
"id": "error",
"httpRequest": {
"path": ".*"
},
"priority": 1,
"httpResponse": {
"statusCode": 403,
"reasonPhrase": "Forbidden",
"headers": {
"Connection": [
"keep-alive"
],
"Content-Type": [
"application/json; charset=UTF-8"
],
"x-ua-compatible": [
"IE=edge"
],
"x-frame-options": [
"SAMEORIGIN"
],
"x-content-type-options": [
"nosniff"
],
"x-xss-protection": [
"1; mode=block"
],
"expires": [
"-1"
],
"cache-control": [
"private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
],
"x-ratelimit-remaining": [
"575.0"
],
"x-ratelimit-used": [
"25"
],
"x-ratelimit-reset": [
"143"
],
"X-Moose": [
"majestic"
],
"Accept-Ranges": [
"bytes"
],
"Date": [
"Wed, 05 Jan 2022 14:37:37 GMT"
],
"Via": [
"1.1 varnish"
],
"Vary": [
"accept-encoding"
],
"Strict-Transport-Security": [
"max-age=15552000; includeSubDomains; preload"
],
"Server": [
"snooserv"
],
"X-Clacks-Overhead": [
"GNU Terry Pratchett"
]
}
}
}'
All Responses Timeout
HTTP
PUT /mockserver/expectation HTTP/1.1
Host: localhost:8010
Content-Type: application/json
Content-Length: 251
{
"id": "error",
"httpRequest": {
"path": ".*"
},
"priority": 1,
"httpResponse": {
"body": "should never receive this",
"delay": {
"timeUnit": "SECONDS",
"value": 60
}
}
}
CURL
curl --location --request PUT 'http://localhost:8010/mockserver/expectation' \
--header 'Content-Type: application/json' \
--data-raw '{
"id": "error",
"httpRequest": {
"path": ".*"
},
"priority": 1,
"httpResponse": {
"body": "should never receive this",
"delay": {
"timeUnit": "SECONDS",
"value": 60
}
}
}'
All Responses Drop After Delay (Connection Closed by Server)
HTTP
PUT /mockserver/expectation HTTP/1.1
Host: localhost:8010
Content-Type: application/json
Content-Length: 234
{
"id": "error",
"httpRequest": {
"path": ".*"
},
"priority": 1,
"httpError": {
"dropConnection": true,
"delay": {
"timeUnit": "SECONDS",
"value": 2
}
}
}
CURL
curl --location --request PUT 'http://localhost:8010/mockserver/expectation' \
--header 'Content-Type: application/json' \
--data-raw '{
"id": "error",
"httpRequest": {
"path": ".*"
},
"priority": 1,
"httpError": {
"dropConnection": true,
"delay": {
"timeUnit": "SECONDS",
"value": 2
}
}
}'
Clearing Behavior
PUT /mockserver/clear?type=EXPECTATIONS HTTP/1.1
Host: localhost:8010
Content-Type: application/json
Content-Length: 26
{
"path": "/user/.*"
}
CURL
curl --location --request PUT 'http://localhost:8010/mockserver/clear?type=EXPECTATIONS' \
--header 'Content-Type: application/json' \
--data-raw '{
"path": "/.*"
}'