Skip to content

Commit

Permalink
Tests: Refactor eliminate explicit create of tempfile.TemporaryDirect…
Browse files Browse the repository at this point in the history
…ory where OpenOrCreateDialog.create() can be used
  • Loading branch information
davidfstr committed Jan 10, 2024
1 parent c739a70 commit e2a068b
Show file tree
Hide file tree
Showing 13 changed files with 1,083 additions and 1,119 deletions.
19 changes: 9 additions & 10 deletions src/crystal/tests/test_addrooturl.py
Original file line number Diff line number Diff line change
Expand Up @@ -801,16 +801,15 @@ def _EXPAND_enabled() -> Iterator[None]:
async def _add_url_dialog_open(*, autoclose: bool=True) -> AsyncIterator[AddUrlDialog]:
# Never allow automated tests to make real internet requests
with _urlopen_responding_with(_UrlOpenHttpResponse(code=590, url=ANY)):
with tempfile.TemporaryDirectory(suffix='.crystalproj') as project_dirpath:
async with (await OpenOrCreateDialog.wait_for()).create(project_dirpath) as (mw, _):
click_button(mw.add_url_button)
aud = await AddUrlDialog.wait_for()

try:
yield aud
finally:
if autoclose and aud.shown:
await aud.cancel()
async with (await OpenOrCreateDialog.wait_for()).create() as (mw, _):
click_button(mw.add_url_button)
aud = await AddUrlDialog.wait_for()

try:
yield aud
finally:
if autoclose and aud.shown:
await aud.cancel()


@contextmanager
Expand Down
45 changes: 22 additions & 23 deletions src/crystal/tests/test_disk_io_errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,31 +26,30 @@ async def test_given_default_revision_with_missing_body_when_download_related_re
with served_project('testdata_xkcd.crystalproj.zip') as sp:
home_url = sp.get_request_url('https://xkcd.com/')

with tempfile.TemporaryDirectory(suffix='.crystalproj') as project_dirpath:
async with (await OpenOrCreateDialog.wait_for()).create(project_dirpath) as (mw, _):
project = Project._last_opened_project
assert project is not None

# Download revision
r = Resource(project, home_url)
revision_future = r.download_body()
async with (await OpenOrCreateDialog.wait_for()).create() as (mw, _):
project = Project._last_opened_project
assert project is not None

# Download revision
r = Resource(project, home_url)
revision_future = r.download_body()
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

# Simulate loss of revision body file
revision = revision_future.result()
os.remove(revision._body_filepath)

# Download related resource
with redirect_stderr(io.StringIO()) as captured_stderr:
revision_future = r.download(wait_for_embedded=True, needs_result=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

# Simulate loss of revision body file
revision = revision_future.result()
os.remove(revision._body_filepath)

# Download related resource
with redirect_stderr(io.StringIO()) as captured_stderr:
revision_future = r.download(wait_for_embedded=True, needs_result=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)
assert 'is missing its body on disk. Redownloading it.' in captured_stderr.getvalue()
revision = revision_future.result()
assert revision.has_body
with revision.open(): # ensure no error
pass
assert 'is missing its body on disk. Redownloading it.' in captured_stderr.getvalue()
revision = revision_future.result()
assert revision.has_body
with revision.open(): # ensure no error
pass


@skip('fails: not implemented')
Expand Down
175 changes: 84 additions & 91 deletions src/crystal/tests/test_download.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,16 @@ async def test_downloads_embedded_resources() -> None:
)
})
with server:
with tempfile.TemporaryDirectory(suffix='.crystalproj') as project_dirpath:
async with (await OpenOrCreateDialog.wait_for()).create(project_dirpath) as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/', '/assets/image.png'] == server.requested_paths
async with (await OpenOrCreateDialog.wait_for()).create() as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/', '/assets/image.png'] == server.requested_paths


async def test_does_not_download_embedded_resources_of_http_4xx_and_5xx_pages() -> None:
Expand Down Expand Up @@ -82,17 +81,16 @@ async def test_does_not_download_embedded_resources_of_http_4xx_and_5xx_pages()
)
})
with server:
with tempfile.TemporaryDirectory(suffix='.crystalproj') as project_dirpath:
async with (await OpenOrCreateDialog.wait_for()).create(project_dirpath) as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/'] == server.requested_paths
async with (await OpenOrCreateDialog.wait_for()).create() as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/'] == server.requested_paths


async def test_does_not_download_embedded_resources_of_recognized_binary_resource() -> None:
Expand All @@ -108,17 +106,16 @@ async def test_does_not_download_embedded_resources_of_recognized_binary_resourc
)
})
with server:
with tempfile.TemporaryDirectory(suffix='.crystalproj') as project_dirpath:
async with (await OpenOrCreateDialog.wait_for()).create(project_dirpath) as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/'] == server.requested_paths
async with (await OpenOrCreateDialog.wait_for()).create() as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/'] == server.requested_paths


async def test_does_not_download_forever_given_embedded_resources_form_a_cycle() -> None:
Expand Down Expand Up @@ -153,17 +150,16 @@ async def test_does_not_download_forever_given_embedded_resources_form_a_cycle()
)
})
with server:
with tempfile.TemporaryDirectory(suffix='.crystalproj') as project_dirpath:
async with (await OpenOrCreateDialog.wait_for()).create(project_dirpath) as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/', '/assets/image.png'] == server.requested_paths
async with (await OpenOrCreateDialog.wait_for()).create() as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/', '/assets/image.png'] == server.requested_paths


async def test_does_not_download_forever_given_embedded_resources_nest_infinitely() -> None:
Expand Down Expand Up @@ -198,23 +194,22 @@ async def test_does_not_download_forever_given_embedded_resources_nest_infinitel
)
})
with server:
with tempfile.TemporaryDirectory(suffix='.crystalproj') as project_dirpath:
async with (await OpenOrCreateDialog.wait_for()).create(project_dirpath) as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert 3 == crystal.task._MAX_EMBEDDED_RESOURCE_RECURSION_DEPTH
assert [
'/',
'/assets/image.png', # 1
'/assets/assets/image.png', # 2
'/assets/assets/assets/image.png' # 3
] == server.requested_paths
async with (await OpenOrCreateDialog.wait_for()).create() as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert 3 == crystal.task._MAX_EMBEDDED_RESOURCE_RECURSION_DEPTH
assert [
'/',
'/assets/image.png', # 1
'/assets/assets/image.png', # 2
'/assets/assets/assets/image.png' # 3
] == server.requested_paths


async def test_when_download_resource_given_revision_body_missing_then_redownloads_revision_body() -> None:
Expand Down Expand Up @@ -305,25 +300,24 @@ async def test_when_download_resource_given_all_embedded_resources_already_downl
)
})
with server:
with tempfile.TemporaryDirectory(suffix='.crystalproj') as project_dirpath:
async with (await OpenOrCreateDialog.wait_for()).create(project_dirpath) as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/', '/assets/image.png'] == server.requested_paths
server.requested_paths.clear()

r = Resource(project, server.get_url('/index.php'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/index.php'] == server.requested_paths
async with (await OpenOrCreateDialog.wait_for()).create() as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/', '/assets/image.png'] == server.requested_paths
server.requested_paths.clear()

r = Resource(project, server.get_url('/index.php'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/index.php'] == server.requested_paths


async def test_given_same_resource_embedded_multiple_times_then_downloads_it_only_once() -> None:
Expand All @@ -346,17 +340,16 @@ async def test_given_same_resource_embedded_multiple_times_then_downloads_it_onl
)
})
with server:
with tempfile.TemporaryDirectory(suffix='.crystalproj') as project_dirpath:
async with (await OpenOrCreateDialog.wait_for()).create(project_dirpath) as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/', '/assets/image.png'] == server.requested_paths
async with (await OpenOrCreateDialog.wait_for()).create() as (mw, _):
project = Project._last_opened_project
assert project is not None

r = Resource(project, server.get_url('/'))
revision_future = r.download(wait_for_embedded=True)
while not revision_future.done():
await bg_sleep(DEFAULT_WAIT_PERIOD)

assert ['/', '/assets/image.png'] == server.requested_paths


# ------------------------------------------------------------------------------
Expand Down
Loading

0 comments on commit e2a068b

Please sign in to comment.