forked from move-coop/parsons
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_actblue.py
More file actions
120 lines (91 loc) · 3.73 KB
/
test_actblue.py
File metadata and controls
120 lines (91 loc) · 3.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import unittest
from pathlib import Path
from unittest.mock import MagicMock
import pytest
import requests_mock
from parsons import ActBlue, Table
from test.test_actblue import test_columns_data
TEST_CLIENT_UUID = "someuuid"
TEST_CLIENT_SECRET = "somesecret"
TEST_ID = "12345"
TEST_URI = "https://faketestingurl.com/example"
TEST_CSV_TYPE = "refunded_contributions"
TEST_DATE_RANGE_START = "2017-07-07"
TEST_DATE_RANGE_END = "2017-08-07"
TEST_POST_RESPONSE = {"id": TEST_ID}
TEST_DOWNLOAD_URL = "https://www.example.com/example.csv"
TEST_GET_RESPONSE = {
"id": TEST_ID,
"download_url": TEST_DOWNLOAD_URL,
"status": "complete",
}
class TestActBlue(unittest.TestCase):
@requests_mock.Mocker()
def setUp(self, m):
self.ab = ActBlue(TEST_CLIENT_UUID, TEST_CLIENT_SECRET, TEST_URI)
self.from_csv = Table.from_csv
test_csv_data = Table.from_csv_string(
Path("test/test_actblue/test_csv_data.csv").read_text()
)
Table.from_csv = MagicMock(name="mocked from_csv", return_value=test_csv_data)
def tearDown(self):
Table.from_csv = self.from_csv
@requests_mock.Mocker()
def test_successful_post_request(self, m):
m.post(f"{TEST_URI}/csvs", json=TEST_POST_RESPONSE)
response = self.ab.post_request(TEST_CSV_TYPE, TEST_DATE_RANGE_START, TEST_DATE_RANGE_END)
assert response["id"] == TEST_POST_RESPONSE["id"]
@requests_mock.Mocker()
def test_successful_get_download_url(self, m):
m.get(f"{TEST_URI}/csvs/{TEST_ID}", json=TEST_GET_RESPONSE)
assert self.ab.get_download_url(csv_id=TEST_ID) == TEST_DOWNLOAD_URL
@requests_mock.Mocker()
def test_successful_poll_for_download_url(self, m):
mocked_get_response_no_download_url = {
"id": TEST_ID,
"download_url": None,
"status": "in_progress",
}
m.get(
f"{TEST_URI}/csvs/{TEST_ID}",
[
{"json": mocked_get_response_no_download_url},
{"json": TEST_GET_RESPONSE},
],
)
assert self.ab.poll_for_download_url(csv_id=TEST_ID) == TEST_DOWNLOAD_URL
@requests_mock.Mocker()
def test_successful_get_contributions(self, m):
m.post(f"{TEST_URI}/csvs", json=TEST_POST_RESPONSE)
m.get(f"{TEST_URI}/csvs/{TEST_ID}", json=TEST_GET_RESPONSE)
table = self.ab.get_contributions(TEST_CSV_TYPE, TEST_DATE_RANGE_START, TEST_DATE_RANGE_END)
assert test_columns_data.expected_table_columns == table.columns
@requests_mock.Mocker()
def test_error_on_complete_without_download_url(self, m):
mocked_get_response_no_url = {
"id": TEST_ID,
"download_url": None,
"status": "complete",
}
m.get(f"{TEST_URI}/csvs/{TEST_ID}", json=mocked_get_response_no_url)
with pytest.raises(ValueError, match="CSV generation failed"):
self.ab.get_download_url(csv_id=TEST_ID)
@requests_mock.Mocker()
def test_error_on_unexpected_status(self, m):
mocked_get_response_no_url = {
"id": TEST_ID,
"download_url": None,
"status": "error",
}
m.get(f"{TEST_URI}/csvs/{TEST_ID}", json=mocked_get_response_no_url)
with pytest.raises(ValueError, match="CSV generation failed"):
self.ab.get_download_url(csv_id=TEST_ID)
@requests_mock.Mocker()
def test_no_error_on_expected_status(self, m):
mocked_get_response_no_url = {
"id": TEST_ID,
"download_url": "www.actblue.com",
"status": "complete",
}
m.get(f"{TEST_URI}/csvs/{TEST_ID}", json=mocked_get_response_no_url)
assert self.ab.get_download_url(csv_id=TEST_ID) == "www.actblue.com"