Skip to content

Commit ef5b927

Browse files
committed
Add PromoOfferRequestTrackingCode class and corresponding tests
- Introduced PromoOfferRequestTrackingCode class for handling request tracking promo codes. - Implemented request method with detailed type hints and Google-style docstrings. - Added comprehensive test cases for successful requests, error handling, and validation checks in test_promo_offers.py. - Updated imports in test files to include the new class.
1 parent 7965194 commit ef5b927

File tree

2 files changed

+154
-2
lines changed

2 files changed

+154
-2
lines changed

admitad/items/promo_offers.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
from admitad.items.base import Item
22

33

4+
__all__ = [
5+
'PromoOffersForCampaign',
6+
'PromoOfferRequestTrackingCode',
7+
]
8+
9+
410
class PromoOffersForCampaign(Item):
511
"""
612
List of the campaign promo offers
@@ -28,3 +34,44 @@ def get(self, _id: int, **kwargs: dict) -> dict:
2834
.set_pagination(**kwargs)
2935
.request(**request_data)
3036
)
37+
38+
39+
class PromoOfferRequestTrackingCode(Item):
40+
"""
41+
Request tracking promo code for website from specific promo offer
42+
"""
43+
44+
SCOPE = 'request_tracking_coupon'
45+
46+
URL = Item.prepare_url('advcampaigns/request-tracking-coupon')
47+
48+
def request(
49+
self,
50+
coupon_id: int,
51+
advcampaign_id: int,
52+
website_id: int,
53+
) -> dict:
54+
"""
55+
Args:
56+
coupon_id (int): ID promo offer (coupon)
57+
advcampaign_id (int): ID advertising campaign
58+
website_id (int): ID website
59+
60+
Returns:
61+
dict: Answer with assigned promo code and tracking link
62+
{
63+
"assigned_promo_code": str | None, # promo code or None if request is created
64+
"tracking_link": str | None, # tracking link or None
65+
}
66+
"""
67+
request_data = {
68+
'coupon_id': Item.sanitize_id(coupon_id),
69+
'advcampaign_id': Item.sanitize_id(advcampaign_id),
70+
'website_id': Item.sanitize_id(website_id),
71+
}
72+
73+
return (
74+
self.transport.post()
75+
.set_data(request_data)
76+
.request(url=self.URL)
77+
)

admitad/tests/test_promo_offers.py

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import unittest
22
import responses
33

4-
from admitad.items import PromoOffersForCampaign
4+
from admitad.exceptions import HttpException
5+
from admitad.items import PromoOffersForCampaign, PromoOfferRequestTrackingCode
56
from admitad.tests.base import BaseTestCase
67

78

89
class PromoOffersForCampaignTestCase(BaseTestCase):
910

10-
def test_get_promo_offers_for_campaign_request(self):
11+
def test_get_promo_offers_for_campaign_request(self) -> None:
1112
with responses.RequestsMock() as resp:
1213
resp.add(
1314
resp.GET,
@@ -24,5 +25,109 @@ def test_get_promo_offers_for_campaign_request(self):
2425
self.assertIn('status', result)
2526

2627

28+
class PromoOfferRequestTrackingCodeTestCase(BaseTestCase):
29+
30+
def test_request_tracking_promo_code_success(self) -> None:
31+
with responses.RequestsMock() as resp:
32+
resp.add(
33+
resp.POST,
34+
PromoOfferRequestTrackingCode.URL,
35+
json={
36+
'assigned_promo_code': 'TESTCODE123',
37+
'tracking_link': 'https://ad.admitad.com/g/123abc/'
38+
},
39+
status=200
40+
)
41+
result = self.client.PromoOfferRequestTrackingCode.request(
42+
coupon_id=100,
43+
advcampaign_id=200,
44+
website_id=300
45+
)
46+
47+
self.assertIn('assigned_promo_code', result)
48+
self.assertIn('tracking_link', result)
49+
self.assertEqual(result['assigned_promo_code'], 'TESTCODE123')
50+
51+
def test_request_tracking_promo_code_creates_request(self) -> None:
52+
with responses.RequestsMock() as resp:
53+
resp.add(
54+
resp.POST,
55+
PromoOfferRequestTrackingCode.URL,
56+
json={
57+
'assigned_promo_code': None,
58+
'tracking_link': None
59+
},
60+
status=200
61+
)
62+
result = self.client.PromoOfferRequestTrackingCode.request(
63+
coupon_id=100,
64+
advcampaign_id=200,
65+
website_id=300
66+
)
67+
68+
self.assertIn('assigned_promo_code', result)
69+
self.assertIn('tracking_link', result)
70+
self.assertIsNone(result['assigned_promo_code'])
71+
self.assertIsNone(result['tracking_link'])
72+
73+
def test_request_tracking_promo_code_no_coupon_error(self) -> None:
74+
with responses.RequestsMock() as resp:
75+
resp.add(
76+
resp.POST,
77+
PromoOfferRequestTrackingCode.URL,
78+
json={
79+
'error_code': 'CHECK_PRE_APPROVED_COUPON_ERROR_CODE_NO_COUPON'
80+
},
81+
status=400
82+
)
83+
with self.assertRaises(HttpException):
84+
self.client.PromoOfferRequestTrackingCode.request(
85+
coupon_id=100,
86+
advcampaign_id=200,
87+
website_id=300
88+
)
89+
90+
def test_request_tracking_promo_code_not_connected_error(self) -> None:
91+
with responses.RequestsMock() as resp:
92+
resp.add(
93+
resp.POST,
94+
PromoOfferRequestTrackingCode.URL,
95+
json={
96+
'error_code': 'webmaster_not_connected'
97+
},
98+
status=400
99+
)
100+
with self.assertRaises(HttpException):
101+
self.client.PromoOfferRequestTrackingCode.request(
102+
coupon_id=100,
103+
advcampaign_id=200,
104+
website_id=300
105+
)
106+
107+
def test_request_tracking_promo_code_invalid_coupon_id(self) -> None:
108+
with self.assertRaises(ValueError):
109+
self.client.PromoOfferRequestTrackingCode.request(
110+
coupon_id=0,
111+
advcampaign_id=200,
112+
website_id=300
113+
)
114+
115+
def test_request_tracking_promo_code_invalid_advcampaign_id(self) -> None:
116+
with self.assertRaises(ValueError):
117+
self.client.PromoOfferRequestTrackingCode.request(
118+
coupon_id=100,
119+
advcampaign_id=0,
120+
website_id=300
121+
)
122+
123+
def test_request_tracking_promo_code_invalid_website_id(self) -> None:
124+
with self.assertRaises(ValueError):
125+
self.client.PromoOfferRequestTrackingCode.request(
126+
coupon_id=100,
127+
advcampaign_id=200,
128+
website_id=0,
129+
)
130+
131+
27132
if __name__ == '__main__':
28133
unittest.main()

0 commit comments

Comments
 (0)