Skip to content

Commit

Permalink
add account creation
Browse files Browse the repository at this point in the history
  • Loading branch information
CarloDePieri committed Aug 10, 2024
1 parent 8ec0bcb commit 045c310
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 2 deletions.
32 changes: 32 additions & 0 deletions pymailtm/api/account.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from pydantic import BaseModel

from pymailtm.api.credentials import Credentials
from pymailtm.api.connection_manager import ConnectionManager


class Account(BaseModel):
id: str
address: str
quota: int
used: int
isDisabled: bool
isDeleted: bool
createdAt: str
updatedAt: str


class AccountController:

def __init__(self, connection_manager: ConnectionManager):
self.connection_manager = connection_manager
self.endpoint = "accounts"

def create_account(self, credentials: Credentials) -> Account:
response = self.connection_manager.post(
self.endpoint,
{
"address": credentials.address,
"password": credentials.password,
},
)
return Account(**response.json())
21 changes: 19 additions & 2 deletions pymailtm/api/connection_manager.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from __future__ import annotations
from requests import get, HTTPError, Response
from requests import get, post, HTTPError, Response
from urllib.parse import urljoin
from time import sleep
import json

from pymailtm.api.logger import log

Expand Down Expand Up @@ -52,11 +53,27 @@ def __init__(
self.base_url = base_url
self.handle_rate_limit = handle_rate_limit
self.rate_limit_delay = rate_limit_delay
self.headers = {
"accept": "application/ld+json",
"Content-Type": "application/json",
}

@rate_limit_handler
def get(self, endpoint: str) -> Response:
"""Perform a GET request to the specified endpoint."""
response = get(urljoin(self.base_url, endpoint))
response = get(urljoin(self.base_url, endpoint), headers=self.headers)
raise_for_status(response)
log(f"HTTP GET {endpoint} -> {response.status_code}: {response.json()}")
return response

@rate_limit_handler
def post(self, endpoint, data: dict) -> Response:
"""Perform a POST request to the specified endpoint."""
response = post(
urljoin(self.base_url, endpoint),
data=json.dumps(data),
headers=self.headers,
)
raise_for_status(response)
log(f"HTTP POST {endpoint} -> {response.status_code}: {response.json()}")
return response
30 changes: 30 additions & 0 deletions tests/api/test_account.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import pytest

from conftest import BASE_URL

from pymailtm.api.account import AccountController
from pymailtm.api.credentials import Credentials
from pymailtm.api.connection_manager import ConnectionManager


class TestAnAccountController:
"""Test: An Account Controller..."""

ac: AccountController

@pytest.fixture(scope="class", autouse=True)
def setup(self, request):
"""TestAnAccountController setup"""
request.cls.ac = AccountController(ConnectionManager(BASE_URL))

def test_should_be_able_to_create_a_new_account(self, mock_api, mocks):
"""An account controller should be able to create a new account."""
# set up the api mock
mock_api.post(f"{BASE_URL}/accounts", json=mocks.json_account)
credentials = Credentials(address="user@domain.test", password="password")

# create a new account
account = self.ac.create_account(credentials)
assert account == mocks.account
assert credentials.address
assert credentials.password
22 changes: 22 additions & 0 deletions tests/mocks_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from typing import List

from pymailtm.api.domain import Domain
from pymailtm.api.account import Account
from pymailtm.api.auth import Token


@dataclass
Expand All @@ -19,6 +21,24 @@ class MocksData:
json_domains: dict
json_domains_pages: List[dict]
domain: Domain
json_account = {
"address": "a8a78e47bc32496aa345b6501aebfda0@dummymailtmdomain.com",
"createdAt": "2024-08-09T19:27:24+00:00",
"id": "66b66d9cfdf11bf4bf13e676",
"isDeleted": False,
"isDisabled": False,
"quota": 40000000,
"updatedAt": "2024-08-09T19:27:24+00:00",
"used": 0,
}
json_token = {"token": "dummy_token"}
json_empty_domains = {
"@context": "/contexts/Domain",
"@id": "/domains",
"@type": "hydra:Collection",
"hydra:member": [],
"hydra:totalItems": 0,
}

def __init__(self):
self.json_domains = {
Expand Down Expand Up @@ -52,3 +72,5 @@ def __init__(self):
}
self.json_domains_pages = [domains_page_1, domains_page_2]
self.domain = Domain(**self.json_domain)
self.account = Account(**self.json_account)
self.token = Token(**self.json_token)

0 comments on commit 045c310

Please sign in to comment.