diff --git a/tests/end2end/data/downloads/download2.bin b/tests/end2end/data/downloads/download2.bin
new file mode 100644
index 000000000..09f370e38
Binary files /dev/null and b/tests/end2end/data/downloads/download2.bin differ
diff --git a/tests/end2end/data/downloads/downloads.html b/tests/end2end/data/downloads/downloads.html
new file mode 100644
index 000000000..308fcd51a
--- /dev/null
+++ b/tests/end2end/data/downloads/downloads.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Simple downloads
+
+
+ download.bin
+ download2.bin
+
+
diff --git a/tests/end2end/features/downloads.feature b/tests/end2end/features/downloads.feature
index 35ad7da12..18a4b9a95 100644
--- a/tests/end2end/features/downloads.feature
+++ b/tests/end2end/features/downloads.feature
@@ -4,6 +4,41 @@ Feature: Downloading things from a website.
Given I set up a temporary download dir
And I clean old downloads
+ ## starting downloads
+
+ Scenario: Clicking an unknown link
+ When I set storage -> prompt-download-directory to false
+ And I open data/downloads/downloads.html
+ And I run :click-element id download
+ And I wait until the download is finished
+ Then the downloaded file download.bin should exist
+
+ Scenario: Using :download
+ When I set storage -> prompt-download-directory to false
+ When I run :download http://localhost:(port)/data/downloads/download.bin
+ And I wait until the download is finished
+ Then the downloaded file download.bin should exist
+
+ Scenario: Using hints
+ When I set storage -> prompt-download-directory to false
+ And I open data/downloads/downloads.html
+ And I hint with args "links download" and follow a
+ And I wait until the download is finished
+ Then the downloaded file download.bin should exist
+
+ Scenario: Using rapid hints
+ # We don't expect any prompts with rapid hinting even if this is true
+ When I set storage -> prompt-download-directory to true
+ And I open data/downloads/downloads.html
+ And I hint with args "--rapid links download" and follow a
+ And I run :follow-hint s
+ And I wait until the download download.bin is finished
+ And I wait until the download download2.bin is finished
+ Then the downloaded file download.bin should exist
+ Then the downloaded file download2.bin should exist
+
+ ## Regression tests
+
Scenario: Downloading which redirects with closed tab (issue 889)
When I set tabs -> last-close to blank
And I open data/downloads/issue889.html
@@ -47,6 +82,25 @@ Feature: Downloading things from a website.
And I run :prompt-accept
Then the error "Download error: SSL handshake failed" should be shown
+ Scenario: Closing window with remove-finished-downloads timeout (issue 1242)
+ When I set ui -> remove-finished-downloads to 500
+ And I open data/downloads/download.bin in a new window
+ And I wait until the download is finished
+ And I run :close
+ And I wait 0.5s
+ Then no crash should happen
+
+ Scenario: Quitting with finished downloads and confirm-quit=downloads (issue 846)
+ Given I have a fresh instance
+ When I set storage -> prompt-download-directory to false
+ And I set ui -> confirm-quit to downloads
+ And I open data/downloads/download.bin
+ And I wait until the download is finished
+ And I run :close
+ Then qutebrowser should quit
+
+ ## :download-retry
+
Scenario: Retrying a failed download
When I run :download http://localhost:(port)/does-not-exist
And I wait for the error "Download error: * - server replied: NOT FOUND"
@@ -66,6 +120,8 @@ Feature: Downloading things from a website.
When I run :download-retry
Then the error "No failed downloads!" should be shown
+ ## Wrong invocations
+
Scenario: :download with deprecated dest-old argument
When I run :download http://localhost:(port)/ deprecated-argument
Then the warning ":download [url] [dest] is deprecated - use download --dest [dest] [url]" should be shown
@@ -79,6 +135,8 @@ Feature: Downloading things from a website.
When I run :download --mhtml http://foobar/
Then the error "Can only download the current page as mhtml." should be shown
+ ## mhtml downloads
+
Scenario: Downloading as mhtml is available
When I open html
And I run :download --mhtml
@@ -183,7 +241,7 @@ Feature: Downloading things from a website.
And I wait until the download is finished
Then "Opening *download.bin* with [*python*]" should be logged
- ## https://github.com/The-Compiler/qutebrowser/issues/1728
+ # https://github.com/The-Compiler/qutebrowser/issues/1728
Scenario: Cancelling a download that should be opened
When I set storage -> prompt-download-directory to true
@@ -192,7 +250,7 @@ Feature: Downloading things from a website.
And I run :download-cancel
Then "* finished but not successful, not opening!" should be logged
- ## https://github.com/The-Compiler/qutebrowser/issues/1725
+ # https://github.com/The-Compiler/qutebrowser/issues/1725
Scenario: Directly open a download with a very long filename
When I set storage -> prompt-download-directory to true
@@ -223,23 +281,26 @@ Feature: Downloading things from a website.
And I open data/downloads/download.bin
Then the download prompt should be shown with "{downloaddir}/download.bin"
- ## https://github.com/The-Compiler/qutebrowser/issues/1242
+ ## storage -> remember-download-directory
- Scenario: Closing window with remove-finished-downloads timeout
- When I set ui -> remove-finished-downloads to 500
- And I open data/downloads/download.bin in a new window
- And I wait until the download is finished
- And I run :close
- And I wait 0.5s
- Then no crash should happen
-
- ## https://github.com/The-Compiler/qutebrowser/issues/846
-
- Scenario: Quitting with finished downloads and confirm-quit=downloads
- Given I have a fresh instance
- When I set storage -> prompt-download-directory to false
- And I set ui -> confirm-quit to downloads
+ Scenario: Remembering the last download directory
+ When I set storage -> prompt-download-directory to true
+ And I set completion -> download-path-suggestion to both
+ And I set storage -> remember-download-directory to true
And I open data/downloads/download.bin
- And I wait until the download is finished
- And I run :close
- Then qutebrowser should quit
+ And I wait for the download prompt for "*/download.bin"
+ # (tmpdir) equals {downloaddir}
+ And I run :prompt-accept (tmpdir)/subdir
+ And I open data/downloads/download2.bin
+ Then the download prompt should be shown with "{downloaddir}/subdir/download2.bin"
+
+ Scenario: Not remembering the last download directory
+ When I set storage -> prompt-download-directory to true
+ And I set completion -> download-path-suggestion to both
+ And I set storage -> remember-download-directory to false
+ And I open data/downloads/download.bin
+ And I wait for the download prompt for "{downloaddir}/download.bin"
+ # (tmpdir) equals {downloaddir}
+ And I run :prompt-accept (tmpdir)/subdir
+ And I open data/downloads/download2.bin
+ Then the download prompt should be shown with "{downloaddir}/download2.bin"
diff --git a/tests/end2end/features/test_downloads_bdd.py b/tests/end2end/features/test_downloads_bdd.py
index ce060ae77..745a515f4 100644
--- a/tests/end2end/features/test_downloads_bdd.py
+++ b/tests/end2end/features/test_downloads_bdd.py
@@ -30,11 +30,17 @@ pytestmark = pytest.mark.qtwebengine_todo("Downloads not implemented yet",
run=False)
+PROMPT_MSG = ("Asking question "
+ "text='Save file to:'>, *")
+
+
@bdd.given("I set up a temporary download dir")
def temporary_download_dir(quteproc, tmpdir):
quteproc.set_setting('storage', 'prompt-download-directory', 'false')
quteproc.set_setting('storage', 'remember-download-directory', 'false')
quteproc.set_setting('storage', 'download-directory', str(tmpdir))
+ (tmpdir / 'subdir').ensure(dir=True)
@bdd.given("I clean old downloads")
@@ -54,6 +60,12 @@ def wait_for_download_finished_name(quteproc, name):
message='Download {} finished'.format(name))
+@bdd.when(bdd.parsers.parse('I wait for the download prompt for "{path}"'))
+def wait_for_download_prompt(tmpdir, quteproc, path):
+ full_path = path.replace('{downloaddir}', str(tmpdir)).replace('/', os.sep)
+ quteproc.wait_for(message=PROMPT_MSG.format(full_path))
+
+
@bdd.when("I download an SSL page")
def download_ssl_page(quteproc, ssl_server):
quteproc.send_cmd(':download https://localhost:{}/'
@@ -76,10 +88,7 @@ def download_should_exist(filename, tmpdir):
'"{path}"'))
def download_prompt(tmpdir, quteproc, path):
full_path = path.replace('{downloaddir}', str(tmpdir)).replace('/', os.sep)
- msg = ("Asking question "
- "text='Save file to:'>, *".format(full_path=full_path))
- quteproc.wait_for(message=msg)
+ quteproc.wait_for(message=PROMPT_MSG.format(full_path))
quteproc.send_cmd(':leave-mode')