Files
ngrok-api-python/tests/test_ngrok.py
ericandAmp 4918d2d51f Remove deprecated edge and backend API tests
- Remove test_backends() function that tests deprecated backend APIs
- Remove test_tcp_edges() function that tests deprecated TCP edge APIs
- Remove test_tls_edges() function that tests deprecated TLS edge APIs
- Remove test_https_edges() function that tests deprecated HTTPS edge APIs
- Update generated client code to reflect API deprecations

These test functions would no longer pass due to the deprecation of edge
and backend related APIs. The client library no longer exposes these APIs.

Amp-Thread-ID: https://ampcode.com/threads/T-40db5ce4-b00c-48f1-b53a-467c3454aadd
Co-authored-by: Amp <amp@ampcode.com>
2025-09-05 22:10:44 +00:00

683 lines
24 KiB
Python

# Code generated for API Clients. DO NOT EDIT.
import json
import os
import unittest
from typing import Optional, Mapping, Union, Dict, Any
import ngrok
import ngrok.http_client
def setup_api_client():
c = ngrok.Client(os.getenv("NGROK_API_KEY"))
mock = MockHTTPClient()
if not os.getenv('TEST_NO_MOCK', False):
c.http_client = mock
elif os.getenv('TEST_DEBUG', False):
c.http_client = RecordingHTTPClient(c.http_client.api_key, c.http_client.base_url)
return c, mock
class TestQuickstartExamples(unittest.TestCase):
def test_quickstart_examples(self):
c, mock = setup_api_client()
# list all online tunnels
mock.returns(mock_tunnels_list)
tunnels = c.tunnels.list()
for t in tunnels:
pass
assert len(tunnels.tunnels) == 1
# create an ip policy the allows traffic from some subnets
mock.returns(mock_ip_policy)
policy = c.ip_policies.create()
for cidr in ["24.0.0.0/8", "12.0.0.0/8"]:
mock.returns(mock_ip_policy_rule)
rule = c.ip_policy_rules.create(cidr=cidr, ip_policy_id=policy.id, action="allow")
assert rule.action == "allow"
# list all ip policies, transparently fetching additional
# pages for you if necessary
mock.returns(mock_ip_policy_rules_list)
for p in c.ip_policies.list():
pass
# create a credential
mock.returns(mock_cred)
cred = c.credentials.create()
assert cred.metadata == ""
# get a credential
mock.returns(mock_cred)
cred = c.credentials.get("cr_27nRxf2wJGXDKuTjMkUpaWMoN1B")
assert cred.metadata == ""
# update the metadata of a credential
mock.returns(mock_updated_cred)
cred.update(metadata=json.dumps({
"foo": "bar",
}))
mock.returns(mock_updated_cred)
cred = c.credentials.get("cr_27nRxf2wJGXDKuTjMkUpaWMoN1B")
assert cred.metadata == "{foo:bar}"
# or do it in single call
mock.returns(mock_updated_cred)
cred = c.credentials.update("cr_27nRxf2wJGXDKuTjMkUpaWMoN1B", metadata=json.dumps({
"foo": "bar",
}))
assert cred.metadata == "{foo:bar}"
with self.assertRaises(ngrok.Error):
mock.returns(mock_ip_policy)
policy = c.ip_policies.create()
mock.returns(ngrok.Error(error_code=404, message="error", http_status_code=404, details=None))
c.ip_policy_rules.create(cidr="24.0.0.0/8", ip_policy_id=policy.id, action="not a valid action")
def test_domains():
c, mock = setup_api_client()
mock.returns(mock_domains_list)
c.reserved_domains.list()
mock.returns(mock_reserved_domain)
domain = c.reserved_domains.create(domain="foo.ngrok.io.lan")
mock.returns(mock_reserved_domain)
domain = c.reserved_domains.get(domain.id)
assert domain.domain == "foo.ngrok.io.lan"
mock.returns(None)
domain.delete()
def test_addrs():
c, mock = setup_api_client()
mock.returns(mock_addrs_list)
c.reserved_domains.list()
mock.returns(mock_reserved_addr)
addr = c.reserved_addrs.create()
mock.returns(mock_reserved_addr)
addr = c.reserved_addrs.get(addr.id)
assert addr.addr == "1.tcp.ngrok.io.lan:20020"
mock.returns(None)
addr.delete()
def test_certificate_authorities():
c, mock = setup_api_client()
mock.returns(mock_empty_ca_list)
c.certificate_authorities.list()
mock.returns(mock_ca)
ca_desc = "python api client tests"
ca_created = c.certificate_authorities.create(ca_pem=ca_pem, description=ca_desc)
assert ca_created.description == ca_desc
# get the instance and assert it's the same
mock.returns(mock_ca)
ca_instance = c.certificate_authorities.get(ca_created.id)
assert ca_created == ca_instance
# update
mock.returns(mock_ca_updated)
ca_meta = '{"hello": "metadata"}'
ca_updated = c.certificate_authorities.update(ca_created.id, metadata=ca_meta)
assert ca_updated.metadata == ca_meta
assert ca_created.id == ca_updated.id
# get the instance again and assert it's the same
mock.returns(mock_ca_updated)
ca_instance_after_update = c.certificate_authorities.get(ca_updated.id)
assert ca_updated == ca_instance_after_update
# value is present in list
mock.returns(mock_ca_list)
ca_list = c.certificate_authorities.list()
assert ca_created.id in [ca.id for ca in ca_list]
# delete
mock.returns(None)
c.certificate_authorities.delete(ca_created.id)
# 404 after delete
try:
mock.returns(ngrok.NotFoundError(error_code=0, message='Not Found', http_status_code=404, details={}))
c.certificate_authorities.get(ca_created.id)
except ngrok.NotFoundError as e:
assert e.http_status_code == 404
else:
assert False
def test_abuse_reports():
c, mock = setup_api_client()
mock.returns(mock_abuse_report)
report = c.abuse_reports.create(urls=["https://foo.ngrok.io:443"])
assert report.hostnames[0].status == "BANNED"
mock.returns(mock_abuse_report)
report = c.abuse_reports.get(report.id)
assert report.hostnames[0].status == "BANNED"
def test_agent_ingress():
c, mock = setup_api_client()
mock.returns(mock_agent_ingress)
ingress = c.agent_ingresses.create(domain="foo")
mock.returns(mock_agent_ingress)
ingress = c.agent_ingresses.get(ingress.id)
assert ingress.domain == "foo"
mock.returns(None)
ingress.delete()
def test_api_keys():
c, mock = setup_api_client()
mock.returns(mock_api_key)
key = c.api_keys.create()
mock.returns(mock_api_key)
key = c.api_keys.get(key.id)
assert key.id == "ak_27njujFZdCVl6tXApS7OkSm9Eab"
mock.returns(None)
key.delete()
def test_event_subscriptions():
c, mock = setup_api_client()
# create an event subscription with a source
source = ngrok.datatypes.EventSourceReplace(c, {"type": "ip_policy_updated.v0"})
mock.returns(mock_event_susbcription)
ev_sub = c.event_subscriptions.create(description=description, sources=[source], destination_ids=[])
assert ev_sub.description == description
# delete the event subscription
mock.returns(None)
ev_sub.delete()
description = "Test description"
body = "Test body"
status_code = 404
ca_pem = """
-----BEGIN CERTIFICATE-----
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE-----
""".strip()
mock_ca = """
{"id": "ca_1rxxVrrfOFJZ6sidyeheV7e2ONT", "uri": "https://api.ngrok.com/certificate_authorities/ca_1rxxVrrfOFJZ6sidyeheV7e2ONT", "created_at": "2021-05-02T04:59:28Z", "description": "python api client tests", "metadata": "", "ca_pem": "-----BEGIN CERTIFICATE-----\\nMIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\\nA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\\nb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\\nMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\\nYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\\naWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\\njc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\\nxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\\n1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\\nsnUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\\nU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\\n9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\\nBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\\nAQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\\nyj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\\n38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\\nAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\\nDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\\nHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\\n-----END CERTIFICATE-----\\n", "subject_common_name": "GlobalSign Root CA", "not_before": "1998-09-01T12:00:00Z", "not_after": "2028-01-28T12:00:00Z", "key_usages": ["cert_sign", "crl_sign"], "extended_key_usages": []}
"""
mock_ca_updated = """
{"id": "ca_1rxxVrrfOFJZ6sidyeheV7e2ONT", "uri": "https://api.ngrok.com/certificate_authorities/ca_1rxxVrrfOFJZ6sidyeheV7e2ONT", "created_at": "2021-05-02T04:59:28Z", "description": "python api client tests", "metadata": "{\\"hello\\": \\"metadata\\"}", "ca_pem": "-----BEGIN CERTIFICATE-----\\nMIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\\nA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\\nb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\\nMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\\nYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\\naWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\\njc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\\nxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\\n1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\\nsnUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\\nU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\\n9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\\nBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\\nAQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\\nyj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\\n38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\\nAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\\nDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\\nHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\\n-----END CERTIFICATE-----\\n", "subject_common_name": "GlobalSign Root CA", "not_before": "1998-09-01T12:00:00Z", "not_after": "2028-01-28T12:00:00Z", "key_usages": ["cert_sign", "crl_sign"], "extended_key_usages": []}
"""
mock_empty_ca_list = """
{"certificate_authorities": [], "uri": "https://api.ngrok.com/certificate_authorities", "next_page_uri": null}"""
mock_ca_list = f"""
{{"certificate_authorities": [{mock_ca_updated}], "uri": "https://api.ngrok.com/certificate_authorities", "next_page_uri": null}}
"""
mock_event_susbcription = """
{
"created_at": "2022-03-23T23:14:36Z",
"description": "Test description",
"destinations": [],
"id": "esb_26o5oxfrHCu58Cl2pmrLEfEFDHk",
"metadata": "",
"sources": [],
"uri": "https://api.ngrok.com/event_subscriptions/esb_26o5oxfrHCu58Cl2pmrLEfEFDHk"
}
"""
mock_backend_404 = f"""
{{"id": "bkdhr_26tiVXibXEyRMIpFP8iH7YaViYV", "status_code": {status_code}, "body": "{body}", "description": "{description}"}}
"""
mock_backend_tg = f"""
{{"id": "bkdtg_26tiVRnYLbJr4VlLSj9uFB8J8N8", "description": "{description}"}}
"""
mock_backend_fo = f"""
{{"id": "bkdfo_26tiVQge4Ae9qXVmjORlUUbY6FJ", "description": "{description}"}}
"""
mock_edge_tcp = """
{
"backend": {
"backend": {
"id": "bkdtg_26ttrtQgoYT4wF0LbAPyCliCTHu",
"uri": "https://api.ngrok.com/backends/tunnel_group/bkdtg_26ttrtQgoYT4wF0LbAPyCliCTHu"
},
"enabled": true
},
"created_at": "2022-03-26T00:35:11Z",
"description": "Test description",
"hostports": [
"1.tcp.ngrok.io:20021"
],
"id": "edgtcp_26ttrrQ7BvufaOHNk9vBNOcN11e",
"ip_restriction": null,
"metadata": "",
"uri": "https://api.ngrok.com/edges/tcp/edgtcp_26ttrrQ7BvufaOHNk9vBNOcN11e"
}
"""
mock_edge_tls = """
{
"backend": {
"backend": {
"id": "bkdtg_26ttsZg57ucy3iShmgFeW5qnzR9",
"uri": "https://api.ngrok.com/backends/tunnel_group/bkdtg_26ttsZg57ucy3iShmgFeW5qnzR9"
},
"enabled": true
},
"created_at": "2022-03-26T00:35:17Z",
"description": "Test description",
"hostports": [
"utthvga8.ngrok.io:443"
],
"id": "edgtls_26ttsYpqOc6w0WFwi1PIZlN34X8",
"ip_restriction": null,
"metadata": "",
"mutual_tls": null,
"tls_termination": null,
"uri": "https://api.ngrok.com/edges/tls/edgtls_26ttsYpqOc6w0WFwi1PIZlN34X8"
}
"""
mock_edge_https = """
{
"created_at": "2022-03-22T16:32:38Z",
"description": "Test description",
"hostports": null,
"id": "edghts_26kToO8qAA2ylYbFIkywHDSzOUs",
"metadata": "",
"mutual_tls": null,
"routes": [
{
"backend": null,
"circuit_breaker": null,
"compression": {"enabled": true},
"created_at": "2022-03-22T16:35:00Z",
"description": "",
"edge_id": "edghts_26kToO8qAA2ylYbFIkywHDSzOUs",
"id": "edghtsrt_26kU6Fg06LuS6Kk5HpSR0UORGk1",
"ip_restriction": null,
"match": "/",
"match_type": "path_prefix",
"metadata": "",
"oauth": null,
"oidc": null,
"request_headers": null,
"response_headers": null,
"saml": null,
"uri": "",
"webhook_verification": null,
"websocket_tcp_converter": null
}
],
"tls_termination": null,
"uri": "https://api.ngrok.com/edges/https/edghts_26kToO8qAA2ylYbFIkywHDSzOUs"
}
"""
mock_edge_route_https = """
{
"backend": null,
"circuit_breaker": null,
"compression": {"enabled": true},
"created_at": "2022-03-22T16:35:00Z",
"description": "",
"edge_id": "edghts_26kToO8qAA2ylYbFIkywHDSzOUs",
"id": "edghtsrt_26kU6Fg06LuS6Kk5HpSR0UORGk1",
"ip_restriction": null,
"match": "/",
"match_type": "path_prefix",
"metadata": "",
"oauth": null,
"oidc": null,
"request_headers": null,
"response_headers": null,
"saml": null,
"uri": "",
"webhook_verification": null,
"websocket_tcp_converter": null
}
"""
mock_domains_list = """
{
"next_page_uri": null,
"reserved_domains": [
{
"certificate": {
"id": "cert_1x0gxFw5yk5hP9l5CCCeZFJGQYe",
"uri": "https://api.ngrok.com/tls_certificates/cert_1x0gxFw5yk5hP9l5CCCeZFJGQYe"
},
"certificate_management_policy": null,
"certificate_management_status": {
"provisioning_job": null,
"renews_at": "2021-09-27T00:00:00Z"
},
"cname_target": null,
"created_at": "2021-07-29T23:26:04Z",
"description": "",
"domain": "foo.bar.eu.ngrok.io",
"http_endpoint_configuration": null,
"https_endpoint_configuration": null,
"id": "rd_1y0gxIswrmoFkUNRtcFI7Jp3kxc",
"metadata": "",
"region": "eu",
"uri": "https://api.ngrok.com/reserved_domains/rd_1y0gxIswrmoFkUNRtcFI7Jp3kxc"
},
{
"certificate": null,
"certificate_management_policy": null,
"certificate_management_status": null,
"cname_target": null,
"created_at": "2021-08-06T17:52:19Z",
"description": "",
"domain": "example.sa.ngrok.io",
"http_endpoint_configuration": null,
"https_endpoint_configuration": {
"id": "ec_1gUC0ny5iRymskdQR19d3toQfqm",
"uri": "https://api.ngrok.com/endpoint_configurations/ec_1fHC0ny5iRymskdQR19d3toQfqm"
},
"id": "rd_1P3s6a44QOx89K42NUPV94Jrtqv",
"metadata": "",
"region": "sa",
"uri": "https://api.ngrok.com/reserved_domains/rd_1P3s6a44QOx89K42NUPV94Jrtqv"
},
{
"certificate": {
"id": "cert_1wEAwMH75dWjyiceoDA0xw5WY09",
"uri": "https://api.ngrok.com/tls_certificates/cert_1wEAwMH75dWjyiceoDA0xw5WY09"
},
"certificate_management_policy": {
"authority": "letsencrypt",
"private_key_type": "rsa"
},
"certificate_management_status": {
"provisioning_job": null,
"renews_at": "2021-10-02T00:00:00Z"
},
"cname_target": "gqgmkjdu.cname.ngrok.io",
"created_at": "1970-01-01T00:00:00Z",
"description": "",
"domain": "name.example.com",
"http_endpoint_configuration": null,
"https_endpoint_configuration": null,
"id": "rd_8iLLoZgFuC6mYrgRf5NM",
"metadata": "",
"region": "us",
"uri": "https://api.ngrok.com/reserved_domains/rd_8iLLoZgFuC6mYrgRf5NM"
}
],
"uri": "https://api.ngrok.com/reserved_domains"
}
"""
mock_addrs_list = """
{
"next_page_uri": null,
"reserved_addrs": [
{
"addr": "1.tcp.ngrok.io.lan:20020",
"created_at": "2022-04-14T19:03:19Z",
"description": "",
"endpoint_configuration": null,
"id": "ra_27kiEWP6f5f987k0yUlcPE46GZf",
"metadata": "",
"region": "us",
"uri": "https://api.ngrok.com/reserved_addrs/ra_27kiEWP6f5f987k0yUlcPE46GZf"
}
],
"uri": "https://api.ngrok.com/reserved_addrs"
}
"""
mock_tunnels_list = """
{
"next_page_uri": null,
"tunnels": [
{
"endpoint": {
"id": "ep_27nRDPONKvdRWvyUOjJhzllpbhn",
"uri": "https://api.ngrok.com/endpoints/ep_27nRDPONKvdRWvyUOjJhzllpbhn"
},
"forwards_to": "http://localhost:8080",
"id": "tn_27nRDPONKvdRWvyUOjJhzllpbhn",
"metadata": "",
"proto": "https",
"public_url": "https://853095c920d0.ngrok.io",
"region": "us",
"started_at": "2022-04-14T16:29:02Z",
"tunnel_session": {
"id": "ts_27nRDLESs1giNY2HHMNPyMNuPh5",
"uri": "https://api.ngrok.com/tunnel_sessions/ts_27nRDLESs1giNY2HHMNPyMNuPh5"
}
}
],
"uri": "https://api.ngrok.com.lan/tunnels"
}
"""
mock_ip_policy = """
{
"created_at": "2022-04-14T16:30:32Z",
"description": "",
"id": "ipp_27nROi2mDmPHZ92203L5aJgCefH",
"metadata": "",
"uri": "https://api.ngrok.com/ip_policies/ipp_27nROi2mDmPHZ92203L5aJgCefH"
}
"""
mock_ip_policy_rule = """
{
"action": "allow",
"cidr": "24.0.0.0/8",
"created_at": "2022-04-14T16:32:47Z",
"description": "",
"id": "ipr_27nRfcc4p85cMaHmApkVxpQDOJo",
"ip_policy": {
"id": "ipp_27nROi2mDmPHZ92203L5aJgCefH",
"uri": "https://api.ngrok.com/ip_policies/ipp_27nROi2mDmPHZ92203L5aJgCefH"
},
"metadata": "",
"uri": "https://api.ngrok.com/ip_policy_rules/ipr_27nRfcc4p85cMaHmApkVxpQDOJo"
}
"""
mock_ip_policy_rules_list = """
{
"ip_policy_rules": [
{
"action": "allow",
"cidr": "12.0.0.0/8",
"created_at": "2022-04-14T16:33:58Z",
"description": "",
"id": "ipr_27nRoYzr2pPCWdwzZIP6husmX6C",
"ip_policy": {
"id": "ipp_27nROi2mDmPHZ92203L5aJgCefH",
"uri": "https://api.ngrok.com/ip_policies/ipp_27nROi2mDmPHZ92203L5aJgCefH"
},
"metadata": "",
"uri": "https://api.ngrok.com/ip_policy_rules/ipr_27nRoYzr2pPCWdwzZIP6husmX6C"
},
{
"action": "allow",
"cidr": "24.0.0.0/8",
"created_at": "2022-04-14T16:32:47Z",
"description": "",
"id": "ipr_27nRfcc4p85cMaHmApkVxpQDOJo",
"ip_policy": {
"id": "ipp_27nROi2mDmPHZ92203L5aJgCefH",
"uri": "https://api.ngrok.com/ip_policies/ipp_27nROi2mDmPHZ92203L5aJgCefH"
},
"metadata": "",
"uri": "https://api.ngrok.com/ip_policy_rules/ipr_27nRfcc4p85cMaHmApkVxpQDOJo"
}
],
"next_page_uri": null,
"uri": "https://api.ngrok.com/ip_policy_rules"
}
"""
mock_cred = """
{
"acl": [],
"created_at": "2022-04-14T16:35:11Z",
"description": "",
"id": "cr_27nRxf2wJGXDKuTjMkUpaWMoN1B",
"metadata": "",
"token": "27nRxf2wJGXDKuTjMkUpaWMoN1B_7pUKA1z533U7sGpshjCkU",
"uri": "https://api.ngrok.com/credentials/cr_27nRxf2wJGXDKuTjMkUpaWMoN1B"
}
"""
mock_updated_cred = """
{
"acl": [],
"created_at": "2022-04-14T16:35:11Z",
"description": "",
"id": "cr_27nRxf2wJGXDKuTjMkUpaWMoN1B",
"metadata": "{foo:bar}",
"token": "27nRxf2wJGXDKuTjMkUpaWMoN1B_7pUKA1z533U7sGpshjCkU",
"uri": "https://api.ngrok.com/credentials/cr_27nRxf2wJGXDKuTjMkUpaWMoN1B"
}
"""
mock_abuse_report = """
{
"created_at": "2022-04-14T17:40:52Z",
"hostnames": [
{
"hostname": "foo.ngrok.io:443",
"status": "BANNED"
}
],
"id": "abrp_27nZwwT46wPkmfFfysoE7LpVjbR",
"metadata": "",
"status": "PROCESSED",
"uri": "https://api.ngrok.com/abuse_reports/abrp_27nZwwT46wPkmfFfysoE7LpVjbR",
"urls": [
"https://foo.ngrok.io:443"
]
}
"""
mock_agent_ingress = """
{
"created_at": "2022-04-14T18:59:38Z",
"description": "",
"domain": "foo",
"id": "agin_27njWu1U9FR823pTuRTh8mgrY3h",
"metadata": "",
"ns_targets": [
"1.kube-dns.kube-system.svc.cluster.local.",
"2.kube-dns.kube-system.svc.cluster.local.",
"3.kube-dns.kube-system.svc.cluster.local.",
"4.kube-dns.kube-system.svc.cluster.local."
],
"region_domains": [
"tunnel.us.foo"
],
"uri": "https://api.ngrok.com.lan/agent_ingresses/agin_27njWu1U9FR823pTuRTh8mgrY3h"
}
"""
mock_api_key = """
{
"created_at": "2022-04-14T19:02:48Z",
"description": "",
"id": "ak_27njujFZdCVl6tXApS7OkSm9Eab",
"metadata": "",
"token": "27njujFZdCVl6tXApS7OkSm9Eab_7MufErgFn7SeihmP7v9mn",
"uri": "https://api.ngrok.com/api_keys/ak_27njujFZdCVl6tXApS7OkSm9Eab"
}
"""
mock_reserved_addr = """
{
"addr": "1.tcp.ngrok.io.lan:20020",
"created_at": "2022-04-14T19:03:19Z",
"description": "",
"endpoint_configuration": null,
"id": "ra_27kiEWP6f5f987k0yUlcPE46GZf",
"metadata": "",
"region": "us",
"uri": "https://api.ngrok.com/reserved_addrs/ra_27kiEWP6f5f987k0yUlcPE46GZf"
}
"""
mock_reserved_domain = """
{
"acme_challenge_cname_target": null,
"certificate": null,
"certificate_management_policy": null,
"certificate_management_status": null,
"cname_target": null,
"created_at": "2022-04-14T19:04:14Z",
"description": "",
"domain": "foo.ngrok.io.lan",
"http_endpoint_configuration": null,
"https_endpoint_configuration": null,
"id": "rd_27nk5WLm85y0wqi13XNLobu3Xff",
"metadata": "",
"region": "us",
"uri": "https://api.ngrok.com/reserved_domains/rd_27nk5WLm85y0wqi13XNLobu3Xff"
}
"""
class RecordingHTTPClient(ngrok.http_client.HTTPClient):
""" prints all responses received to stdout, useful for creating mocked outputs """
def do(self, method: str, path: str, query_params: Mapping[str, str] = None, payload: Mapping[str, Any] = None) -> Optional[Dict[str, Any]]:
ret = super(RecordingHTTPClient, self).do(method, path, query_params, payload)
print(json.dumps(ret))
return ret
class MockHTTPClient(ngrok.http_client.HTTPClient):
def __init__(self):
pass
def returns(self, val: Union[Optional[Dict[str, Any]], Exception]):
if isinstance(val, str):
self._val = json.loads(val)
else:
self._val = val
def do(self, method: str, path: str, query_params: Mapping[str, str] = None, payload: Mapping[str, Any] = None) -> Optional[Dict[str, Any]]:
if isinstance(self._val, Exception):
raise self._val
else:
return self._val