Skip to content

Commit

Permalink
Merge 21fa5cd into 3bebdb1
Browse files Browse the repository at this point in the history
  • Loading branch information
kanemathers committed Mar 20, 2020
2 parents 3bebdb1 + 21fa5cd commit 92176f3
Show file tree
Hide file tree
Showing 16 changed files with 348 additions and 10 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ cache:
env:
global:
# If changing this number, please also change it in `tests/conftest.py`.
- TELNYX_MOCK_VERSION=0.8.4
- TELNYX_MOCK_VERSION=0.8.5

before_install:
# Unpack and start telnyx-mock so that the test suite can talk to it
Expand Down
12 changes: 12 additions & 0 deletions telnyx/api_resources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,13 @@
from telnyx.api_resources.available_phone_number import AvailablePhoneNumber
from telnyx.api_resources.call import Call
from telnyx.api_resources.conference import Conference
from telnyx.api_resources.connection import Connection
from telnyx.api_resources.credential_connection import CredentialConnection
from telnyx.api_resources.event import Event
from telnyx.api_resources.fqdn import FQDN
from telnyx.api_resources.fqdn_connection import FQDNConnection
from telnyx.api_resources.ip import IP
from telnyx.api_resources.ip_connection import IPConnection
from telnyx.api_resources.list_object import ListObject
from telnyx.api_resources.message import Message
from telnyx.api_resources.messaging_phone_number import MessagingPhoneNumber
Expand All @@ -23,7 +29,13 @@
"AvailablePhoneNumber",
"Call",
"Conference",
"Connection",
"CredentialConnection",
"Event",
"FQDN",
"FQDNConnection",
"IP",
"IPConnection",
"ListObject",
"Message",
"MessagingPhoneNumber",
Expand Down
20 changes: 18 additions & 2 deletions telnyx/api_resources/abstract/api_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,24 @@ class APIResource(TelnyxObject):
@classmethod
def retrieve(cls, id, api_key=None, **params):
instance = cls(id, api_key, **params)
instance.refresh()
return instance
response = instance.request("get", instance.instance_url())

# It's not always the case that `cls.retrieve()` should return an
# object of type `cls`, as the response's `record_type` might indicate
# another `telnyx.api_resources.*` type.
#
# If this is the case, we simply return the already initialised
# `response` instance.
#
# Otherwise, we will have an object of type `TelnyxObject`, the
# default type returned by `util.convert_to_telnyx_object`, and we
# promote the object back to an `APIResource`.
if type(response) == TelnyxObject:
instance.refresh_from(response)

return instance
else:
return response

def refresh(self):
self.refresh_from(self.request("get", self.instance_url()))
Expand Down
7 changes: 7 additions & 0 deletions telnyx/api_resources/connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from __future__ import absolute_import, division, print_function

from telnyx.api_resources.abstract import ListableAPIResource


class Connection(ListableAPIResource):
OBJECT_NAME = "connection"
17 changes: 17 additions & 0 deletions telnyx/api_resources/credential_connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from __future__ import absolute_import, division, print_function

from telnyx.api_resources.abstract import (
CreateableAPIResource,
DeletableAPIResource,
ListableAPIResource,
UpdateableAPIResource,
)


class CredentialConnection(
CreateableAPIResource,
DeletableAPIResource,
ListableAPIResource,
UpdateableAPIResource,
):
OBJECT_NAME = "credential_connection"
17 changes: 17 additions & 0 deletions telnyx/api_resources/fqdn.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from __future__ import absolute_import, division, print_function

from telnyx.api_resources.abstract import (
CreateableAPIResource,
DeletableAPIResource,
ListableAPIResource,
UpdateableAPIResource,
)


class FQDN(
CreateableAPIResource,
DeletableAPIResource,
ListableAPIResource,
UpdateableAPIResource,
):
OBJECT_NAME = "fqdn"
17 changes: 17 additions & 0 deletions telnyx/api_resources/fqdn_connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from __future__ import absolute_import, division, print_function

from telnyx.api_resources.abstract import (
CreateableAPIResource,
DeletableAPIResource,
ListableAPIResource,
UpdateableAPIResource,
)


class FQDNConnection(
CreateableAPIResource,
DeletableAPIResource,
ListableAPIResource,
UpdateableAPIResource,
):
OBJECT_NAME = "fqdn_connection"
17 changes: 17 additions & 0 deletions telnyx/api_resources/ip.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from __future__ import absolute_import, division, print_function

from telnyx.api_resources.abstract import (
CreateableAPIResource,
DeletableAPIResource,
ListableAPIResource,
UpdateableAPIResource,
)


class IP(
CreateableAPIResource,
DeletableAPIResource,
ListableAPIResource,
UpdateableAPIResource,
):
OBJECT_NAME = "ip"
17 changes: 17 additions & 0 deletions telnyx/api_resources/ip_connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from __future__ import absolute_import, division, print_function

from telnyx.api_resources.abstract import (
CreateableAPIResource,
DeletableAPIResource,
ListableAPIResource,
UpdateableAPIResource,
)


class IPConnection(
CreateableAPIResource,
DeletableAPIResource,
ListableAPIResource,
UpdateableAPIResource,
):
OBJECT_NAME = "ip_connection"
18 changes: 12 additions & 6 deletions telnyx/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,17 +100,23 @@ def load_object_classes():
OBJECT_CLASSES = {
# business objects
api_resources.APIKey.OBJECT_NAME: api_resources.APIKey,
api_resources.AvailablePhoneNumber.OBJECT_NAME: api_resources.AvailablePhoneNumber,
api_resources.Call.OBJECT_NAME: api_resources.Call,
api_resources.Conference.OBJECT_NAME: api_resources.Conference,
api_resources.Connection.OBJECT_NAME: api_resources.Connection,
api_resources.CredentialConnection.OBJECT_NAME: api_resources.CredentialConnection,
api_resources.FQDN.OBJECT_NAME: api_resources.FQDN,
api_resources.FQDNConnection.OBJECT_NAME: api_resources.FQDNConnection,
api_resources.IP.OBJECT_NAME: api_resources.IP,
api_resources.IPConnection.OBJECT_NAME: api_resources.IPConnection,
api_resources.Message.OBJECT_NAME: api_resources.Message,
api_resources.MessagingProfile.OBJECT_NAME: api_resources.MessagingProfile,
api_resources.MessagingPhoneNumber.OBJECT_NAME: api_resources.MessagingPhoneNumber,
api_resources.ShortCode.OBJECT_NAME: api_resources.ShortCode,
api_resources.PublicKey.OBJECT_NAME: api_resources.PublicKey,
api_resources.AvailablePhoneNumber.OBJECT_NAME: api_resources.AvailablePhoneNumber,
api_resources.MessagingProfile.OBJECT_NAME: api_resources.MessagingProfile,
api_resources.NumberOrder.OBJECT_NAME: api_resources.NumberOrder,
api_resources.NumberOrderPhoneNumber.OBJECT_NAME: api_resources.NumberOrderPhoneNumber,
api_resources.NumberReservation.OBJECT_NAME: api_resources.NumberReservation,
api_resources.Call.OBJECT_NAME: api_resources.Call,
api_resources.Conference.OBJECT_NAME: api_resources.Conference,
api_resources.PublicKey.OBJECT_NAME: api_resources.PublicKey,
api_resources.ShortCode.OBJECT_NAME: api_resources.ShortCode,
}


Expand Down
26 changes: 26 additions & 0 deletions tests/api_resources/test_connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from __future__ import absolute_import, division, print_function

import telnyx

TEST_RESOURCE_ID = "6a09cdc3-8948-47f0-aa62-74ac943d6c58"


class TestConnection(object):
connection_types = (
telnyx.IPConnection,
telnyx.CredentialConnection,
telnyx.IP,
telnyx.FQDNConnection,
telnyx.FQDN,
)

def test_is_listable(self, request_mock):
resources = telnyx.Connection.list()
request_mock.assert_requested("get", "/v2/connections")
assert isinstance(resources.data, list)
assert isinstance(resources.data[0], self.connection_types)

def test_is_retrievable(self, request_mock):
resource = telnyx.Connection.retrieve(TEST_RESOURCE_ID)
request_mock.assert_requested("get", "/v2/connections/%s" % TEST_RESOURCE_ID)
assert isinstance(resource, self.connection_types)
49 changes: 49 additions & 0 deletions tests/api_resources/test_credential_connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from __future__ import absolute_import, division, print_function

import telnyx

TEST_RESOURCE_ID = "6a09cdc3-8948-47f0-aa62-74ac943d6c58"


class TestCredentialConnection(object):
def test_is_listable(self, request_mock):
resources = telnyx.CredentialConnection.list()
request_mock.assert_requested("get", "/v2/credential_connections")
assert isinstance(resources.data, list)
assert isinstance(resources.data[0], telnyx.CredentialConnection)

def test_is_retrievable(self, request_mock):
resource = telnyx.CredentialConnection.retrieve(TEST_RESOURCE_ID)
request_mock.assert_requested(
"get", "/v2/credential_connections/%s" % TEST_RESOURCE_ID
)
assert isinstance(resource, telnyx.CredentialConnection)

def test_is_creatable(self, request_mock):
resource = telnyx.CredentialConnection.create(active=True)
request_mock.assert_requested("post", "/v2/credential_connections")
assert isinstance(resource, telnyx.CredentialConnection)

def test_is_saveable(self, request_mock):
credential_connection = telnyx.CredentialConnection.retrieve(TEST_RESOURCE_ID)
credential_connection.active = False
resource = credential_connection.save()
request_mock.assert_requested(
"patch", "/v2/credential_connections/%s" % TEST_RESOURCE_ID
)
assert isinstance(resource, telnyx.CredentialConnection)
assert resource is credential_connection

def test_is_modifiable(self, request_mock):
resource = telnyx.CredentialConnection.modify(TEST_RESOURCE_ID, active=False)
request_mock.assert_requested(
"patch", "/v2/credential_connections/%s" % TEST_RESOURCE_ID
)
assert isinstance(resource, telnyx.CredentialConnection)

def test_is_deletable(self, request_mock):
resource = telnyx.CredentialConnection.retrieve(TEST_RESOURCE_ID)
resource.delete()
request_mock.assert_requested(
"delete", "/v2/credential_connections/%s" % TEST_RESOURCE_ID
)
41 changes: 41 additions & 0 deletions tests/api_resources/test_fqdn.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from __future__ import absolute_import, division, print_function

import telnyx

TEST_RESOURCE_ID = "6a09cdc3-8948-47f0-aa62-74ac943d6c58"


class TestFQDN(object):
def test_is_listable(self, request_mock):
resources = telnyx.FQDN.list()
request_mock.assert_requested("get", "/v2/fqdns")
assert isinstance(resources.data, list)
assert isinstance(resources.data[0], telnyx.FQDN)

def test_is_retrievable(self, request_mock):
resource = telnyx.FQDN.retrieve(TEST_RESOURCE_ID)
request_mock.assert_requested("get", "/v2/fqdns/%s" % TEST_RESOURCE_ID)
assert isinstance(resource, telnyx.FQDN)

def test_is_creatable(self, request_mock):
resource = telnyx.FQDN.create(fqdn="example.com")
request_mock.assert_requested("post", "/v2/fqdns")
assert isinstance(resource, telnyx.FQDN)

def test_is_saveable(self, request_mock):
fqdn = telnyx.FQDN.retrieve(TEST_RESOURCE_ID)
fqdn.fqdn = "new-example.com"
resource = fqdn.save()
request_mock.assert_requested("patch", "/v2/fqdns/%s" % TEST_RESOURCE_ID)
assert isinstance(resource, telnyx.FQDN)
assert resource is fqdn

def test_is_modifiable(self, request_mock):
resource = telnyx.FQDN.modify(TEST_RESOURCE_ID, fqdn="new-example.com")
request_mock.assert_requested("patch", "/v2/fqdns/%s" % TEST_RESOURCE_ID)
assert isinstance(resource, telnyx.FQDN)

def test_is_deletable(self, request_mock):
resource = telnyx.FQDN.retrieve(TEST_RESOURCE_ID)
resource.delete()
request_mock.assert_requested("delete", "/v2/fqdns/%s" % TEST_RESOURCE_ID)
49 changes: 49 additions & 0 deletions tests/api_resources/test_fqdn_connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from __future__ import absolute_import, division, print_function

import telnyx

TEST_RESOURCE_ID = "6a09cdc3-8948-47f0-aa62-74ac943d6c58"


class TestFQDNConnection(object):
def test_is_listable(self, request_mock):
resources = telnyx.FQDNConnection.list()
request_mock.assert_requested("get", "/v2/fqdn_connections")
assert isinstance(resources.data, list)
assert isinstance(resources.data[0], telnyx.FQDNConnection)

def test_is_retrievable(self, request_mock):
resource = telnyx.FQDNConnection.retrieve(TEST_RESOURCE_ID)
request_mock.assert_requested(
"get", "/v2/fqdn_connections/%s" % TEST_RESOURCE_ID
)
assert isinstance(resource, telnyx.FQDNConnection)

def test_is_creatable(self, request_mock):
resource = telnyx.FQDNConnection.create(active=True)
request_mock.assert_requested("post", "/v2/fqdn_connections")
assert isinstance(resource, telnyx.FQDNConnection)

def test_is_saveable(self, request_mock):
fqdn_connection = telnyx.FQDNConnection.retrieve(TEST_RESOURCE_ID)
fqdn_connection.active = False
resource = fqdn_connection.save()
request_mock.assert_requested(
"patch", "/v2/fqdn_connections/%s" % TEST_RESOURCE_ID
)
assert isinstance(resource, telnyx.FQDNConnection)
assert resource is fqdn_connection

def test_is_modifiable(self, request_mock):
resource = telnyx.FQDNConnection.modify(TEST_RESOURCE_ID, active=False)
request_mock.assert_requested(
"patch", "/v2/fqdn_connections/%s" % TEST_RESOURCE_ID
)
assert isinstance(resource, telnyx.FQDNConnection)

def test_is_deletable(self, request_mock):
resource = telnyx.FQDNConnection.retrieve(TEST_RESOURCE_ID)
resource.delete()
request_mock.assert_requested(
"delete", "/v2/fqdn_connections/%s" % TEST_RESOURCE_ID
)
Loading

0 comments on commit 92176f3

Please sign in to comment.