"""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 == []