Skip to content

Commit

Permalink
Merge pull request #19 from JaviCerveraIngram/model_methods
Browse files Browse the repository at this point in the history
Model methods
  • Loading branch information
marcserrat authored Mar 13, 2019
2 parents 03cd3e4 + 4eebbc1 commit 1dd2361
Show file tree
Hide file tree
Showing 5 changed files with 259 additions and 20 deletions.
12 changes: 11 additions & 1 deletion connect/models/asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,17 @@


class Asset(BaseModel):
pass
def get_param_by_id(self, id_):
try:
return list(filter(lambda param: param.id == id_, self.params))[0]
except IndexError:
return None

def get_item_by_mpn(self, mpn):
try:
return list(filter(lambda item: item.mpn == mpn, self.items))[0]
except IndexError:
return None


class AssetSchema(BaseSchema):
Expand Down
18 changes: 17 additions & 1 deletion connect/models/fulfillment.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,23 @@


class Fulfillment(BaseModel):
pass
@property
def new_items(self):
return list(filter(
lambda item: item.quantity > 0 and item.old_quantity == 0,
self.asset.items))

@property
def changed_items(self):
return list(filter(
lambda item: item.quantity > 0 and item.old_quantity > 0,
self.asset.items))

@property
def removed_items(self):
return list(filter(
lambda item: item.quantity == 0 and item.old_quantity > 0,
self.asset.items))


class FulfillmentSchema(BaseSchema):
Expand Down
2 changes: 1 addition & 1 deletion connect/models/product.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class Item(BaseModel):
class ItemSchema(BaseSchema):
global_id = fields.Str()
mpn = fields.Str()
old_quantity = fields.Str()
old_quantity = fields.Integer()
quantity = fields.Integer()

@post_load
Expand Down
145 changes: 145 additions & 0 deletions tests/response2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
[
{
"asset": {
"connection": {
"id": "CT-0000-0000-0000",
"provider": {
"id": "PA-473-705",
"name": "ACME Provider"
},
"type": "preview",
"vendor": {
"id": "VA-691-879",
"name": "Marc FSG"
}
},
"external_id": "899",
"id": "AS-893-495-635-9",
"items": [
{
"id": "TEAM_ST3L2T1Y",
"mpn": "TEAM-ST3L2T1Y",
"old_quantity": "0",
"quantity": "100"
},
{
"id": "TEAM_ST3L2TAC1M",
"mpn": "TEAM-ST3L2TAC1M",
"old_quantity": "0",
"quantity": "200"
},
{
"id": "UPSIZE_TEST",
"mpn": "UPSIZE_TEST",
"old_quantity": "200",
"quantity": "201"
},
{
"id": "DOWNSIZE_TEST",
"mpn": "DOWNSIZE_TEST",
"old_quantity": "200",
"quantity": "199"
},
{
"id": "DELETE_TEST",
"mpn": "DELETE_TEST",
"old_quantity": "200",
"quantity": "0"
}
],
"params": [
{
"description": "How customer Feels",
"id": "howyoufeel",
"name": "How You feel today?",
"type": "dropdown",
"value": "Good",
"value_choices": [
{
"label": "Really Good",
"value": "reallygood"
},
{
"label": "Good",
"value": "Good"
},
{
"label": "Don't ask",
"value": "bad"
}
],
"value_error": ""
},
{
"description": "Team Identifier on Dropbox system",
"id": "teamID",
"name": "Team ID",
"type": "text",
"value": "1",
"value_choices": [],
"value_error": ""
}
],
"product": {
"id": "CN-573-708-587",
"name": "Dropbox Test"
},
"tiers": {
"customer": {
"contact_info": {
"address_line1": "Darren Passage",
"address_line2": "",
"city": "West Douglas",
"contact": {
"email": "markbrooks-0189@VA-691-879.com",
"first_name": "Mark",
"last_name": "Brooks",
"phone_number": {
"area_code": "1",
"country_code": "+252",
"extension": "",
"phone_number": "474842"
}
},
"country": "us",
"postal_code": "30690",
"state": "Nevada"
},
"external_id": "889",
"id": "TA-0-5870-9239-0029",
"name": "Kaiser LLC"
},
"tier1": {
"contact_info": {
"address_line1": "noname",
"address_line2": "",
"city": "noname",
"contact": {
"email": "no-reply@acme.example.com",
"first_name": "ACME",
"last_name": "Reseller",
"phone_number": {
"area_code": "234",
"country_code": "+1",
"extension": "",
"phone_number": "567890"
}
},
"country": "us",
"postal_code": "12111",
"state": "Alaska"
},
"external_id": "1",
"id": "TA-0-7251-3930-7482",
"name": "ACME Reseller"
},
"tier2": {}
}
},
"created": "2018-09-03T10:28:18.472670+00:00",
"id": "PR-5620-6510-8214",
"status": "approved",
"type": "purchase",
"updated": "2018-09-04T10:38:58.045330+00:00"
}
]
102 changes: 85 additions & 17 deletions tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,35 +11,39 @@

from mock import MagicMock, patch

from connect.config import Config
from connect.models import Param
from connect.models.asset import Asset
from connect.models.fulfillment import Fulfillment
from connect.models.product import Item
from connect.resource import FulfillmentResource

response = namedtuple('Response', ('ok', 'content'))
Response = namedtuple('Response', ('ok', 'content'))


def _get_response_ok():
response.ok = True
with open(os.path.join(os.path.dirname(__file__), 'response.json')) as file:
response.content = file.read()
with open(os.path.join(os.path.dirname(__file__), 'response.json')) as file_handle:
content = file_handle.read()
return Response(ok=True, content=content)

return response

def _get_response2_ok():
with open(os.path.join(os.path.dirname(__file__), 'response2.json')) as file_handle:
content = file_handle.read()
return Response(ok=True, content=content)


@patch('requests.get', MagicMock(return_value=_get_response_ok()))
def test_create_model_from_response():
config = Config(api_key='ApiKey XXXX:YYYYY', api_url='http://localhost:8080/api/public/v1/')
# Parse JSON data from response file
with open(os.path.join(os.path.dirname(__file__), 'response.json')) as file_handle:
content = json.loads(file_handle.read())[0]

requests = FulfillmentResource(config).list()
request_obj = FulfillmentResource(config).get(pk='PR-000-000-000')

assert requests[0].id == request_obj.id
content = json.loads(response.content)[0]
assert request_obj.id == content['id']
assert request_obj.contract.id == content['contract']['id']
assert request_obj.marketplace.id == content['marketplace']['id']
assert request_obj.asset.id == content['asset']['id']
assert request_obj.asset.product.id == content['asset']['product']['id']
# Get requests from response
resource = FulfillmentResource()
requests = resource.list()
request_obj = resource.get(pk='PR-000-000-000')

# Assert that all properties exist
try:
(
request_obj.contract,
Expand All @@ -63,3 +67,67 @@ def test_create_model_from_response():
)
except AttributeError:
assert False, 'Incorrectly initialized model '

# Assert that returned data matches the one in the file
assert requests[0].id == request_obj.id
assert request_obj.id == content['id']
assert request_obj.contract.id == content['contract']['id']
assert request_obj.marketplace.id == content['marketplace']['id']
assert request_obj.asset.id == content['asset']['id']
assert request_obj.asset.product.id == content['asset']['product']['id']
try:
# Python 2
assert isinstance(request_obj.asset.external_id, basestring)
except NameError:
# Python 3
assert isinstance(request_obj.asset.external_id, str)


@patch('requests.get', MagicMock(return_value=_get_response2_ok()))
def test_fulfillment_items():
# Get request
requests = FulfillmentResource().list()
assert len(requests) == 1
request = requests[0]
assert isinstance(request, Fulfillment)

# Test new items
new_items = request.new_items
assert isinstance(new_items, list)
assert len(new_items) == 2
for item in new_items:
assert isinstance(item, Item)

# Test changed items
changed_items = request.changed_items
assert isinstance(new_items, list)
assert len(changed_items) == 2
for item in changed_items:
assert isinstance(item, Item)

# Test removed items
removed_items = request.removed_items
assert isinstance(removed_items, list)
assert len(removed_items) == 1
for item in removed_items:
assert isinstance(item, Item)


@patch('requests.get', MagicMock(return_value=_get_response2_ok()))
def test_asset_methods():
# Get asset
requests = FulfillmentResource().list()
assert len(requests) == 1
assert isinstance(requests[0], Fulfillment)
asset = requests[0].asset
assert isinstance(asset, Asset)

# Get param by id
assert isinstance(asset.get_param_by_id('howyoufeel'), Param)
assert asset.get_param_by_id('howyoufeel').id == 'howyoufeel'
assert not asset.get_param_by_id('invalid-id')

# Get item by id
assert isinstance(asset.get_item_by_mpn('TEAM-ST3L2T1Y'), Item)
assert asset.get_item_by_mpn('TEAM-ST3L2T1Y').mpn == 'TEAM-ST3L2T1Y'
assert not asset.get_item_by_mpn('invalid-mpn')

0 comments on commit 1dd2361

Please sign in to comment.