forked from sass/tipibot
Fix sheet error
This commit is contained in:
90
tests/test_sheet_columns.py
Normal file
90
tests/test_sheet_columns.py
Normal file
@@ -0,0 +1,90 @@
|
||||
"""Regression tests: member-sheet writes must target columns by live header name.
|
||||
|
||||
The roster sheet gained a "Käepael" column after "Nimi". Writes used to take
|
||||
their position from EXPECTED_HEADERS, so every write landed one column left -
|
||||
the TRUE/FALSE synced flag overwrote "Roll", and /check then reported
|
||||
"Rolli 'FALSE' ei leitud serverist" for every member.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from core import sheets # noqa: E402
|
||||
from tests.conftest import run # noqa: E402
|
||||
|
||||
LIVE_HEADER = [
|
||||
"Nimi", "Käepael", "Organisatsioon", "Meil", "Discord", "User ID", "Sünnipäev",
|
||||
"Telefon", "Valdkond", "Roll", "Discordis synced?", "Groupi lisatud?", "Särk",
|
||||
]
|
||||
|
||||
|
||||
class FakeWorksheet:
|
||||
def __init__(self, header: list[str]):
|
||||
self.header = header
|
||||
self.updates: list[tuple[str, str]] = []
|
||||
self.cell_updates: list[tuple[int, int, str]] = []
|
||||
self.appended: list[list[str]] = []
|
||||
|
||||
def row_values(self, index: int) -> list[str]:
|
||||
assert index == 1
|
||||
return list(self.header)
|
||||
|
||||
def update(self, values, range_name, value_input_option=None):
|
||||
self.updates.append((range_name, values[0][0]))
|
||||
|
||||
def update_cells(self, cells, value_input_option=None):
|
||||
self.cell_updates.extend((c.row, c.col, c.value) for c in cells)
|
||||
|
||||
def append_row(self, row, value_input_option=None):
|
||||
self.appended.append(list(row))
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sheet(monkeypatch):
|
||||
ws = FakeWorksheet(LIVE_HEADER)
|
||||
row = {h: "" for h in LIVE_HEADER}
|
||||
row.update({"Nimi": "Mari Tamm", "Discord": "mari", "User ID": "123", "Roll": "Vabatahtlik"})
|
||||
monkeypatch.setattr(sheets, "_worksheet", ws)
|
||||
monkeypatch.setattr(sheets, "_headers", [], raising=False)
|
||||
monkeypatch.setattr(sheets, "_cache", [row])
|
||||
return ws
|
||||
|
||||
|
||||
def test_set_synced_writes_live_synced_column_not_roll(sheet):
|
||||
assert run(sheets.set_synced(123, False)) is True
|
||||
assert sheet.updates == [("K3", "FALSE")] # K = "Discordis synced?", J would be "Roll"
|
||||
assert sheets.get_cache()[0]["Roll"] == "Vabatahtlik"
|
||||
|
||||
|
||||
def test_batch_set_synced_uses_live_column(sheet):
|
||||
run(sheets.batch_set_synced([(123, True)]))
|
||||
assert sheet.cell_updates == [(3, 11, "TRUE")]
|
||||
|
||||
|
||||
def test_update_username_writes_discord_column_not_meil(sheet):
|
||||
run(sheets.update_username(123, "mari_new"))
|
||||
assert sheet.updates == [("E3", "mari_new")]
|
||||
|
||||
|
||||
def test_add_new_member_row_places_values_by_header(sheet):
|
||||
run(sheets.add_new_member_row("uus", 456))
|
||||
(row,) = sheet.appended
|
||||
assert len(row) == len(LIVE_HEADER)
|
||||
assert row[LIVE_HEADER.index("Discord")] == "uus"
|
||||
assert row[LIVE_HEADER.index("User ID")] == "456"
|
||||
assert row[LIVE_HEADER.index("Discordis synced?")] == "FALSE"
|
||||
assert row[LIVE_HEADER.index("Roll")] == ""
|
||||
assert sheets.find_member_by_id(456)["Discord"] == "uus"
|
||||
|
||||
|
||||
def test_missing_column_refuses_to_write(monkeypatch, sheet):
|
||||
sheet.header = [h for h in LIVE_HEADER if h != "Discordis synced?"]
|
||||
assert run(sheets.set_synced(123, True)) is False
|
||||
run(sheets.batch_set_synced([(123, True)]))
|
||||
assert sheet.updates == [] and sheet.cell_updates == []
|
||||
Reference in New Issue
Block a user