kopia lustrzana https://github.com/bellingcat/auto-archiver
132 wiersze
4.9 KiB
Python
132 wiersze
4.9 KiB
Python
# Note this isn't a feeder, but contained as utility of the gsheet feeder module
|
|
import pytest
|
|
|
|
from auto_archiver.modules.gsheet_feeder_db import GWorksheet
|
|
|
|
|
|
class TestGWorksheet:
|
|
@pytest.fixture
|
|
def mock_worksheet(self, mocker):
|
|
mock_ws = mocker.MagicMock()
|
|
mock_ws.get_values.return_value = [
|
|
["Link", "Archive Status", "Archive Location", "Archive Date"],
|
|
["url1", "archived", "filepath1", "2023-01-01"],
|
|
["url2", "pending", "filepath2", "2023-01-02"],
|
|
]
|
|
return mock_ws
|
|
|
|
@pytest.fixture
|
|
def gworksheet(self, mock_worksheet):
|
|
return GWorksheet(mock_worksheet)
|
|
|
|
# Test initialization and basic properties
|
|
def test_initialization_sets_headers(self, gworksheet):
|
|
assert gworksheet.headers == ["link", "archive status", "archive location", "archive date"]
|
|
|
|
def test_count_rows_returns_correct_value(self, gworksheet):
|
|
# inc header row
|
|
assert gworksheet.count_rows() == 3
|
|
|
|
# Test column validation and lookup
|
|
@pytest.mark.parametrize(
|
|
"col,expected_index",
|
|
[
|
|
("url", 0),
|
|
("status", 1),
|
|
("archive", 2),
|
|
("date", 3),
|
|
],
|
|
)
|
|
def test_col_index_returns_correct_index(self, gworksheet, col, expected_index):
|
|
assert gworksheet._col_index(col) == expected_index
|
|
|
|
def test_check_col_exists_raises_for_invalid_column(self, gworksheet):
|
|
with pytest.raises(Exception, match="Column invalid_col"):
|
|
gworksheet._check_col_exists("invalid_col")
|
|
|
|
# Test data retrieval
|
|
@pytest.mark.parametrize(
|
|
"row,expected",
|
|
[
|
|
(1, ["Link", "Archive Status", "Archive Location", "Archive Date"]),
|
|
(2, ["url1", "archived", "filepath1", "2023-01-01"]),
|
|
(3, ["url2", "pending", "filepath2", "2023-01-02"]),
|
|
],
|
|
)
|
|
def test_get_row_returns_correct_data(self, gworksheet, row, expected):
|
|
assert gworksheet.get_row(row) == expected
|
|
|
|
@pytest.mark.parametrize(
|
|
"row,col,expected",
|
|
[
|
|
(2, "url", "url1"),
|
|
(2, "status", "archived"),
|
|
(3, "date", "2023-01-02"),
|
|
],
|
|
)
|
|
def test_get_cell_returns_correct_value(self, gworksheet, row, col, expected):
|
|
assert gworksheet.get_cell(row, col) == expected
|
|
|
|
def test_get_cell_handles_fresh_data(self, mock_worksheet, gworksheet):
|
|
mock_worksheet.cell.return_value.value = "fresh_value"
|
|
result = gworksheet.get_cell(2, "url", fresh=True)
|
|
assert result == "fresh_value"
|
|
mock_worksheet.cell.assert_called_once_with(2, 1)
|
|
|
|
# Test edge cases and error handling
|
|
@pytest.mark.parametrize(
|
|
"when_empty,expected",
|
|
[
|
|
(True, "default"),
|
|
(False, ""),
|
|
],
|
|
)
|
|
def test_get_cell_or_default_handles_empty_values(self, mock_worksheet, when_empty, expected):
|
|
mock_worksheet.get_values.return_value[1][0] = "" # Empty URL cell
|
|
g = GWorksheet(mock_worksheet)
|
|
assert g.get_cell_or_default(2, "url", default="default", when_empty_use_default=when_empty) == expected
|
|
|
|
def test_get_cell_or_default_handles_missing_columns(self, gworksheet):
|
|
assert gworksheet.get_cell_or_default(1, "invalid_col", default="safe") == "safe"
|
|
|
|
# Test write operations
|
|
def test_set_cell_updates_correct_position(self, mock_worksheet, gworksheet):
|
|
gworksheet.set_cell(2, "url", "new_url")
|
|
mock_worksheet.update_cell.assert_called_once_with(2, 1, "new_url")
|
|
|
|
def test_batch_set_cell_formats_requests_correctly(self, mock_worksheet, gworksheet):
|
|
updates = [(2, "url", "new_url"), (3, "status", "processed")]
|
|
gworksheet.batch_set_cell(updates)
|
|
expected_batch = [
|
|
{"range": "A2", "values": [["new_url"]]},
|
|
{"range": "B3", "values": [["processed"]]},
|
|
]
|
|
mock_worksheet.batch_update.assert_called_once_with(expected_batch, value_input_option="USER_ENTERED")
|
|
|
|
def test_batch_set_cell_truncates_long_values(self, mock_worksheet, gworksheet):
|
|
long_value = "x" * 50000
|
|
gworksheet.batch_set_cell([(1, "url", long_value)])
|
|
submitted_value = mock_worksheet.batch_update.call_args[0][0][0]["values"][0][0]
|
|
assert len(submitted_value) == 49999
|
|
|
|
# Test coordinate conversion
|
|
@pytest.mark.parametrize(
|
|
"row,col,expected",
|
|
[
|
|
(1, "url", "A1"),
|
|
(2, "status", "B2"),
|
|
(3, "archive", "C3"),
|
|
(4, "date", "D4"),
|
|
],
|
|
)
|
|
def test_to_a1_conversion(self, gworksheet, row, col, expected):
|
|
assert gworksheet.to_a1(row, col) == expected
|
|
|
|
# Test empty worksheet
|
|
def test_empty_worksheet_initialization(self, mocker):
|
|
mock_ws = mocker.MagicMock()
|
|
mock_ws.get_values.return_value = []
|
|
g = GWorksheet(mock_ws)
|
|
assert g.headers == []
|
|
assert g.count_rows() == 0
|