mirror of
https://github.com/onionshare/onionshare.git
synced 2025-05-22 00:00:51 -04:00
Fix the discrepancy between SendBaseModeWeb and Web objects' separate cur_history_id attibutes, ensuring that when we call web.error404() we send a new history_id integer for communicating back to the frontend. Add tests for this
This commit is contained in:
parent
4a4437394d
commit
2c87ea55ff
9 changed files with 92 additions and 15 deletions
|
@ -29,6 +29,9 @@ class SendBaseModeWeb:
|
||||||
# one download at a time.
|
# one download at a time.
|
||||||
self.download_in_progress = False
|
self.download_in_progress = False
|
||||||
|
|
||||||
|
# This tracks the history id
|
||||||
|
self.cur_history_id = 0
|
||||||
|
|
||||||
self.define_routes()
|
self.define_routes()
|
||||||
self.init()
|
self.init()
|
||||||
|
|
||||||
|
@ -264,4 +267,4 @@ class SendBaseModeWeb:
|
||||||
"""
|
"""
|
||||||
Inherited class will implement this.
|
Inherited class will implement this.
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -207,11 +207,15 @@ class ShareModeWeb(SendBaseModeWeb):
|
||||||
if self.download_individual_files:
|
if self.download_individual_files:
|
||||||
return self.stream_individual_file(filesystem_path)
|
return self.stream_individual_file(filesystem_path)
|
||||||
else:
|
else:
|
||||||
return self.web.error404()
|
history_id = self.cur_history_id
|
||||||
|
self.cur_history_id += 1
|
||||||
|
return self.web.error404(history_id)
|
||||||
|
|
||||||
# If it's not a directory or file, throw a 404
|
# If it's not a directory or file, throw a 404
|
||||||
else:
|
else:
|
||||||
return self.web.error404()
|
history_id = self.cur_history_id
|
||||||
|
self.cur_history_id += 1
|
||||||
|
return self.web.error404(history_id)
|
||||||
else:
|
else:
|
||||||
# Special case loading /
|
# Special case loading /
|
||||||
|
|
||||||
|
@ -223,7 +227,9 @@ class ShareModeWeb(SendBaseModeWeb):
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# If the path isn't found, throw a 404
|
# If the path isn't found, throw a 404
|
||||||
return self.web.error404()
|
history_id = self.cur_history_id
|
||||||
|
self.cur_history_id += 1
|
||||||
|
return self.web.error404(history_id)
|
||||||
|
|
||||||
def build_zipfile_list(self, filenames, processed_size_callback=None):
|
def build_zipfile_list(self, filenames, processed_size_callback=None):
|
||||||
self.common.log("ShareModeWeb", "build_zipfile_list")
|
self.common.log("ShareModeWeb", "build_zipfile_list")
|
||||||
|
|
|
@ -63,9 +63,6 @@ class Web:
|
||||||
self.auth = HTTPBasicAuth()
|
self.auth = HTTPBasicAuth()
|
||||||
self.auth.error_handler(self.error401)
|
self.auth.error_handler(self.error401)
|
||||||
|
|
||||||
# This tracks the history id
|
|
||||||
self.cur_history_id = 0
|
|
||||||
|
|
||||||
# Verbose mode?
|
# Verbose mode?
|
||||||
if self.common.verbose:
|
if self.common.verbose:
|
||||||
self.verbose_mode()
|
self.verbose_mode()
|
||||||
|
@ -204,9 +201,7 @@ class Web:
|
||||||
r = make_response(render_template('403.html', static_url_path=self.static_url_path), 403)
|
r = make_response(render_template('403.html', static_url_path=self.static_url_path), 403)
|
||||||
return self.add_security_headers(r)
|
return self.add_security_headers(r)
|
||||||
|
|
||||||
def error404(self):
|
def error404(self, history_id):
|
||||||
history_id = self.cur_history_id
|
|
||||||
self.cur_history_id += 1
|
|
||||||
self.add_request(self.REQUEST_INDIVIDUAL_FILE_STARTED, '{}'.format(request.path), {
|
self.add_request(self.REQUEST_INDIVIDUAL_FILE_STARTED, '{}'.format(request.path), {
|
||||||
'id': history_id,
|
'id': history_id,
|
||||||
'status_code': 404
|
'status_code': 404
|
||||||
|
|
|
@ -539,17 +539,17 @@ class History(QtWidgets.QWidget):
|
||||||
# Header
|
# Header
|
||||||
self.header_label = QtWidgets.QLabel(header_text)
|
self.header_label = QtWidgets.QLabel(header_text)
|
||||||
self.header_label.setStyleSheet(self.common.css['downloads_uploads_label'])
|
self.header_label.setStyleSheet(self.common.css['downloads_uploads_label'])
|
||||||
clear_button = QtWidgets.QPushButton(strings._('gui_all_modes_clear_history'))
|
self.clear_button = QtWidgets.QPushButton(strings._('gui_all_modes_clear_history'))
|
||||||
clear_button.setStyleSheet(self.common.css['downloads_uploads_clear'])
|
self.clear_button.setStyleSheet(self.common.css['downloads_uploads_clear'])
|
||||||
clear_button.setFlat(True)
|
self.clear_button.setFlat(True)
|
||||||
clear_button.clicked.connect(self.reset)
|
self.clear_button.clicked.connect(self.reset)
|
||||||
header_layout = QtWidgets.QHBoxLayout()
|
header_layout = QtWidgets.QHBoxLayout()
|
||||||
header_layout.addWidget(self.header_label)
|
header_layout.addWidget(self.header_label)
|
||||||
header_layout.addStretch()
|
header_layout.addStretch()
|
||||||
header_layout.addWidget(self.in_progress_label)
|
header_layout.addWidget(self.in_progress_label)
|
||||||
header_layout.addWidget(self.completed_label)
|
header_layout.addWidget(self.completed_label)
|
||||||
header_layout.addWidget(self.requests_label)
|
header_layout.addWidget(self.requests_label)
|
||||||
header_layout.addWidget(clear_button)
|
header_layout.addWidget(self.clear_button)
|
||||||
|
|
||||||
# When there are no items
|
# When there are no items
|
||||||
self.empty_image = QtWidgets.QLabel()
|
self.empty_image = QtWidgets.QLabel()
|
||||||
|
|
|
@ -285,6 +285,10 @@ class GuiBaseTest(object):
|
||||||
else:
|
else:
|
||||||
self.assertEqual(self.gui.share_mode.server_status_label.text(), strings._('closing_automatically'))
|
self.assertEqual(self.gui.share_mode.server_status_label.text(), strings._('closing_automatically'))
|
||||||
|
|
||||||
|
def clear_all_history_items(self, mode, count):
|
||||||
|
if count == 0:
|
||||||
|
QtTest.QTest.mouseClick(mode.history.clear_button, QtCore.Qt.LeftButton)
|
||||||
|
self.assertEquals(len(mode.history.item_list.items.keys()), count)
|
||||||
|
|
||||||
# Auto-stop timer tests
|
# Auto-stop timer tests
|
||||||
def set_timeout(self, mode, timeout):
|
def set_timeout(self, mode, timeout):
|
||||||
|
|
|
@ -127,3 +127,12 @@ class GuiReceiveTest(GuiBaseTest):
|
||||||
self.autostop_timer_widget_hidden(self.gui.receive_mode)
|
self.autostop_timer_widget_hidden(self.gui.receive_mode)
|
||||||
self.server_timed_out(self.gui.receive_mode, 15000)
|
self.server_timed_out(self.gui.receive_mode, 15000)
|
||||||
self.web_server_is_stopped()
|
self.web_server_is_stopped()
|
||||||
|
|
||||||
|
def run_all_clear_all_button_tests(self, public_mode):
|
||||||
|
"""Test the Clear All history button"""
|
||||||
|
self.run_all_receive_mode_setup_tests(public_mode)
|
||||||
|
self.upload_file(public_mode, '/tmp/test.txt', 'test.txt')
|
||||||
|
self.history_widgets_present(self.gui.receive_mode)
|
||||||
|
self.clear_all_history_items(self.gui.receive_mode, 0)
|
||||||
|
self.upload_file(public_mode, '/tmp/test.txt', 'test.txt')
|
||||||
|
self.clear_all_history_items(self.gui.receive_mode, 2)
|
||||||
|
|
|
@ -196,6 +196,15 @@ class GuiShareTest(GuiBaseTest):
|
||||||
self.run_all_share_mode_started_tests(public_mode)
|
self.run_all_share_mode_started_tests(public_mode)
|
||||||
self.run_all_share_mode_download_tests(public_mode, stay_open)
|
self.run_all_share_mode_download_tests(public_mode, stay_open)
|
||||||
|
|
||||||
|
def run_all_clear_all_button_tests(self, public_mode, stay_open):
|
||||||
|
"""Test the Clear All history button"""
|
||||||
|
self.run_all_share_mode_setup_tests()
|
||||||
|
self.run_all_share_mode_started_tests(public_mode)
|
||||||
|
self.individual_file_is_viewable_or_not(public_mode, stay_open)
|
||||||
|
self.history_widgets_present(self.gui.share_mode)
|
||||||
|
self.clear_all_history_items(self.gui.share_mode, 0)
|
||||||
|
self.individual_file_is_viewable_or_not(public_mode, stay_open)
|
||||||
|
self.clear_all_history_items(self.gui.share_mode, 2)
|
||||||
|
|
||||||
def run_all_share_mode_individual_file_tests(self, public_mode, stay_open):
|
def run_all_share_mode_individual_file_tests(self, public_mode, stay_open):
|
||||||
"""Tests in share mode when viewing an individual file"""
|
"""Tests in share mode when viewing an individual file"""
|
||||||
|
|
25
tests/local_onionshare_receive_mode_clear_all_button_test.py
Normal file
25
tests/local_onionshare_receive_mode_clear_all_button_test.py
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import pytest
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from .GuiReceiveTest import GuiReceiveTest
|
||||||
|
|
||||||
|
class LocalReceiveModeClearAllButtonTest(unittest.TestCase, GuiReceiveTest):
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
test_settings = {
|
||||||
|
}
|
||||||
|
cls.gui = GuiReceiveTest.set_up(test_settings)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
GuiReceiveTest.tear_down()
|
||||||
|
|
||||||
|
@pytest.mark.gui
|
||||||
|
@pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
|
||||||
|
def test_gui(self):
|
||||||
|
self.run_all_common_setup_tests()
|
||||||
|
self.run_all_clear_all_button_tests(False)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
26
tests/local_onionshare_share_mode_clear_all_button_test.py
Normal file
26
tests/local_onionshare_share_mode_clear_all_button_test.py
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import pytest
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from .GuiShareTest import GuiShareTest
|
||||||
|
|
||||||
|
class LocalShareModeClearAllButtonTest(unittest.TestCase, GuiShareTest):
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
test_settings = {
|
||||||
|
"close_after_first_download": False,
|
||||||
|
}
|
||||||
|
cls.gui = GuiShareTest.set_up(test_settings)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
GuiShareTest.tear_down()
|
||||||
|
|
||||||
|
@pytest.mark.gui
|
||||||
|
@pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
|
||||||
|
def test_gui(self):
|
||||||
|
self.run_all_common_setup_tests()
|
||||||
|
self.run_all_clear_all_button_tests(False, True)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
Loading…
Add table
Add a link
Reference in a new issue