Skip to content

Commit 17a4f59

Browse files
authored
Add integration tests to the test suite (#377)
* Add integration tests to the test suite
1 parent f17bc14 commit 17a4f59

File tree

3 files changed

+138
-19
lines changed

3 files changed

+138
-19
lines changed

.github/workflows/ci.yml

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,47 @@ jobs:
5858
- name: Test Dist Generation
5959
run: |
6060
python setup.py sdist bdist_wheel
61-
twine check dist/*
61+
twine check dist/*
62+
Integration:
63+
continue-on-error: true
64+
runs-on: ${{ matrix.os }}
65+
strategy:
66+
matrix:
67+
os: [macos-latest, windows-latest]
68+
python-version: [2.7, 3.5, 3.6, 3.7, 3.8, pypy2, pypy3]
69+
exclude:
70+
- os: windows-latest
71+
python-version: 3.6
72+
include:
73+
- os: linux
74+
python-version: 3.4
75+
steps:
76+
- uses: actions/[email protected]
77+
- name: Setup Python environment
78+
uses: actions/[email protected]
79+
with:
80+
python-version: ${{ matrix.python-version }}
81+
- name: Install Requirements
82+
run: |
83+
python -m pip install --upgrade pip
84+
pip install flake8 pytest
85+
pip install -r requirements.txt
86+
pip install -r test/requirements.txt
87+
python setup.py install
88+
- name: Run Integration Tests
89+
env:
90+
LEGACY_USER_DROPBOX_TOKEN: ${{ secrets.LEGACY_USER_DROPBOX_TOKEN }}
91+
LEGACY_USER_CLIENT_ID: ${{ secrets.LEGACY_USER_CLIENT_ID }}
92+
LEGACY_USER_CLIENT_SECRET: ${{ secrets.LEGACY_USER_CLIENT_SECRET }}
93+
LEGACY_USER_REFRESH_TOKEN: ${{ secrets.LEGACY_USER_REFRESH_TOKEN }}
94+
SCOPED_USER_DROPBOX_TOKEN: ${{ secrets.SCOPED_USER_DROPBOX_TOKEN }}
95+
SCOPED_USER_CLIENT_ID: ${{ secrets.SCOPED_USER_CLIENT_ID }}
96+
SCOPED_USER_CLIENT_SECRET: ${{ secrets.SCOPED_USER_CLIENT_SECRET }}
97+
SCOPED_USER_REFRESH_TOKEN: ${{ secrets.SCOPED_USER_REFRESH_TOKEN }}
98+
SCOPED_TEAM_DROPBOX_TOKEN: ${{ secrets.SCOPED_TEAM_DROPBOX_TOKEN }}
99+
SCOPED_TEAM_CLIENT_ID: ${{ secrets.SCOPED_TEAM_CLIENT_ID }}
100+
SCOPED_TEAM_CLIENT_SECRET: ${{ secrets.SCOPED_TEAM_CLIENT_SECRET }}
101+
SCOPED_TEAM_REFRESH_TOKEN: ${{ secrets.SCOPED_TEAM_REFRESH_TOKEN }}
102+
DROPBOX_SHARED_LINK: ${{ secrets.DROPBOX_SHARED_LINK }}
103+
run: |
104+
pytest test/integration/test_dropbox.py

.github/workflows/coverage.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,42 @@ jobs:
3131
uses: codecov/[email protected]
3232
with:
3333
flags: unit
34+
fail_ci_if_error: true
35+
IntegrationCoverage:
36+
runs-on: ubuntu-latest
37+
steps:
38+
- uses: actions/checkout@v2
39+
- name: Setup Python environment
40+
uses: actions/[email protected]
41+
with:
42+
python-version: '3.7'
43+
- name: Install Requirements
44+
run: |
45+
python -m pip install --upgrade pip
46+
pip install coverage pytest
47+
pip install -r requirements.txt
48+
pip install -r test/requirements.txt
49+
python setup.py install
50+
- name: Generate Unit Test Coverage
51+
env:
52+
LEGACY_USER_DROPBOX_TOKEN: ${{ secrets.LEGACY_USER_DROPBOX_TOKEN }}
53+
LEGACY_USER_CLIENT_ID: ${{ secrets.LEGACY_USER_CLIENT_ID }}
54+
LEGACY_USER_CLIENT_SECRET: ${{ secrets.LEGACY_USER_CLIENT_SECRET }}
55+
LEGACY_USER_REFRESH_TOKEN: ${{ secrets.LEGACY_USER_REFRESH_TOKEN }}
56+
SCOPED_USER_DROPBOX_TOKEN: ${{ secrets.SCOPED_USER_DROPBOX_TOKEN }}
57+
SCOPED_USER_CLIENT_ID: ${{ secrets.SCOPED_USER_CLIENT_ID }}
58+
SCOPED_USER_CLIENT_SECRET: ${{ secrets.SCOPED_USER_CLIENT_SECRET }}
59+
SCOPED_USER_REFRESH_TOKEN: ${{ secrets.SCOPED_USER_REFRESH_TOKEN }}
60+
SCOPED_TEAM_DROPBOX_TOKEN: ${{ secrets.SCOPED_TEAM_DROPBOX_TOKEN }}
61+
SCOPED_TEAM_CLIENT_ID: ${{ secrets.SCOPED_TEAM_CLIENT_ID }}
62+
SCOPED_TEAM_CLIENT_SECRET: ${{ secrets.SCOPED_TEAM_CLIENT_SECRET }}
63+
SCOPED_TEAM_REFRESH_TOKEN: ${{ secrets.SCOPED_TEAM_REFRESH_TOKEN }}
64+
DROPBOX_SHARED_LINK: ${{ secrets.DROPBOX_SHARED_LINK }}
65+
run: |
66+
coverage run --rcfile=.coveragerc -m pytest test/integration/test_dropbox.py
67+
coverage xml
68+
- name: Publish Coverage
69+
uses: codecov/[email protected]
70+
with:
71+
flags: integration
3472
fail_ci_if_error: true

test/integration/test_dropbox.py

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,24 @@
4040
PathRoot_validator,
4141
)
4242

43-
def _value_from_env_or_die(env_name='DROPBOX_TOKEN'):
43+
# Key Types
44+
REFRESH_TOKEN_KEY = "REFRESH_TOKEN"
45+
ACCESS_TOKEN_KEY = "DROPBOX_TOKEN"
46+
CLIENT_ID_KEY = "CLIENT_ID"
47+
CLIENT_SECRET_KEY = "CLIENT_SECRET"
48+
# App Types
49+
SCOPED_KEY = "SCOPED"
50+
LEGACY_KEY = "LEGACY"
51+
# User Types
52+
USER_KEY = "USER"
53+
TEAM_KEY = "TEAM"
54+
# Misc types
55+
SHARED_LINK_KEY = "DROPBOX_SHARED_LINK"
56+
57+
def format_env_name(app_type=SCOPED_KEY, user_type=USER_KEY, key_type=ACCESS_TOKEN_KEY):
58+
return '{}_{}_{}'.format(app_type, user_type, key_type)
59+
60+
def _value_from_env_or_die(env_name):
4461
value = os.environ.get(env_name)
4562
if value is None:
4663
print('Set {} environment variable to a valid value.'.format(env_name),
@@ -51,35 +68,36 @@ def _value_from_env_or_die(env_name='DROPBOX_TOKEN'):
5168

5269
@pytest.fixture()
5370
def dbx_from_env():
54-
oauth2_token = _value_from_env_or_die()
71+
oauth2_token = _value_from_env_or_die(format_env_name())
5572
return Dropbox(oauth2_token)
5673

5774

5875
@pytest.fixture()
5976
def refresh_dbx_from_env():
60-
refresh_token = _value_from_env_or_die("DROPBOX_REFRESH_TOKEN")
61-
app_key = _value_from_env_or_die("DROPBOX_APP_KEY")
62-
app_secret = _value_from_env_or_die("DROPBOX_APP_SECRET")
77+
refresh_token = _value_from_env_or_die(format_env_name(SCOPED_KEY, USER_KEY, REFRESH_TOKEN_KEY))
78+
app_key = _value_from_env_or_die(format_env_name(SCOPED_KEY, USER_KEY, CLIENT_ID_KEY))
79+
app_secret = _value_from_env_or_die(format_env_name(SCOPED_KEY, USER_KEY, CLIENT_SECRET_KEY))
6380
return Dropbox(oauth2_refresh_token=refresh_token,
6481
app_key=app_key, app_secret=app_secret)
6582

6683

6784
@pytest.fixture()
6885
def dbx_team_from_env():
69-
team_oauth2_token = _value_from_env_or_die('DROPBOX_TEAM_TOKEN')
86+
team_oauth2_token = _value_from_env_or_die(
87+
format_env_name(SCOPED_KEY, TEAM_KEY, ACCESS_TOKEN_KEY))
7088
return DropboxTeam(team_oauth2_token)
7189

7290

7391
@pytest.fixture()
7492
def dbx_app_auth_from_env():
75-
app_key = _value_from_env_or_die("DROPBOX_APP_KEY")
76-
app_secret = _value_from_env_or_die("DROPBOX_APP_SECRET")
93+
app_key = _value_from_env_or_die(format_env_name(SCOPED_KEY, USER_KEY, CLIENT_ID_KEY))
94+
app_secret = _value_from_env_or_die(format_env_name(SCOPED_KEY, USER_KEY, CLIENT_SECRET_KEY))
7795
return Dropbox(app_key=app_key, app_secret=app_secret)
7896

7997

8098
@pytest.fixture()
8199
def dbx_share_url_from_env():
82-
return _value_from_env_or_die("DROPBOX_SHARED_LINK")
100+
return _value_from_env_or_die(SHARED_LINK_KEY)
83101

84102

85103
MALFORMED_TOKEN = 'asdf'
@@ -88,9 +106,31 @@ def dbx_share_url_from_env():
88106
# Need bytes type for Python3
89107
DUMMY_PAYLOAD = string.ascii_letters.encode('ascii')
90108

109+
RANDOM_FOLDER = random.sample(string.ascii_letters, 15)
110+
TIMESTAMP = str(datetime.datetime.utcnow())
111+
STATIC_FILE = "/test.txt"
112+
113+
@pytest.fixture(scope='module', autouse=True)
114+
def pytest_setup():
115+
print("Setup")
116+
dbx = Dropbox(_value_from_env_or_die(format_env_name()))
117+
118+
try:
119+
dbx.files_delete(STATIC_FILE)
120+
except Exception:
121+
print("File not found")
122+
123+
try:
124+
dbx.files_delete('/Test/%s' % TIMESTAMP)
125+
except Exception:
126+
print("File not found")
127+
91128

92129
@pytest.mark.usefixtures(
93-
"dbx_from_env", "refresh_dbx_from_env", "dbx_app_auth_from_env", "dbx_share_url_from_env"
130+
"dbx_from_env",
131+
"refresh_dbx_from_env",
132+
"dbx_app_auth_from_env",
133+
"dbx_share_url_from_env"
94134
)
95135
class TestDropbox:
96136
def test_default_oauth2_urls(self):
@@ -154,16 +194,15 @@ def test_rpc(self, dbx_from_env):
154194

155195
# Test API error
156196
random_folder_path = '/' + \
157-
''.join(random.sample(string.ascii_letters, 15))
197+
''.join(RANDOM_FOLDER)
158198
with pytest.raises(ApiError) as cm:
159199
dbx_from_env.files_list_folder(random_folder_path)
160200
assert isinstance(cm.value.error, ListFolderError)
161201

162202
def test_upload_download(self, dbx_from_env):
163203
# Upload file
164-
timestamp = str(datetime.datetime.utcnow())
165-
random_filename = ''.join(random.sample(string.ascii_letters, 15))
166-
random_path = '/Test/%s/%s' % (timestamp, random_filename)
204+
random_filename = ''.join(RANDOM_FOLDER)
205+
random_path = '/Test/%s/%s' % (TIMESTAMP, random_filename)
167206
test_contents = DUMMY_PAYLOAD
168207
dbx_from_env.files_upload(test_contents, random_path)
169208

@@ -172,7 +211,7 @@ def test_upload_download(self, dbx_from_env):
172211
assert DUMMY_PAYLOAD == resp.content
173212

174213
# Cleanup folder
175-
dbx_from_env.files_delete('/Test/%s' % timestamp)
214+
dbx_from_env.files_delete('/Test/%s' % TIMESTAMP)
176215

177216
def test_bad_upload_types(self, dbx_from_env):
178217
with pytest.raises(TypeError):
@@ -231,11 +270,10 @@ def test_path_root_err(self, dbx_from_env):
231270

232271
def test_versioned_route(self, dbx_from_env):
233272
# Upload a test file
234-
path = '/test.txt'
235-
dbx_from_env.files_upload(DUMMY_PAYLOAD, path)
273+
dbx_from_env.files_upload(DUMMY_PAYLOAD, STATIC_FILE)
236274

237275
# Delete the file with v2 route
238-
resp = dbx_from_env.files_delete_v2(path)
276+
resp = dbx_from_env.files_delete_v2(STATIC_FILE)
239277
# Verify response type is of v2 route
240278
assert isinstance(resp, DeleteResult)
241279

0 commit comments

Comments
 (0)