velxio/backend/tests/test_compile_request_dedup.py

80 lines
2.9 KiB
Python
Raw Normal View History

"""Unit tests for the /compile/start dedup key (_job_key).
Identical content + board + options should map to the same job_id (a duplicate
click while one build is in flight reuses the existing job). Any meaningful
change different sketch, different board, different partition scheme,
different SPIFFS file content must change the key so a fresh build runs.
"""
from __future__ import annotations
from app.api.routes.compile import _job_key
def _files() -> list[dict[str, str]]:
return [{'name': 'sketch.ino', 'content': 'void setup(){} void loop(){}'}]
def test_same_inputs_same_key() -> None:
key1 = _job_key(_files(), 'esp32:esp32:esp32')
key2 = _job_key(_files(), 'esp32:esp32:esp32')
assert key1 == key2
def test_different_sketch_changes_key() -> None:
other_files = [{'name': 'sketch.ino', 'content': '// different'}]
a = _job_key(_files(), 'esp32:esp32:esp32')
b = _job_key(other_files, 'esp32:esp32:esp32')
assert a != b
def test_different_board_changes_key() -> None:
a = _job_key(_files(), 'esp32:esp32:esp32')
b = _job_key(_files(), 'esp32:esp32:esp32s3')
assert a != b
def test_board_options_change_changes_key() -> None:
a = _job_key(_files(), 'esp32:esp32:esp32',
board_options={'partitionScheme': 'huge_app'})
b = _job_key(_files(), 'esp32:esp32:esp32',
board_options={'partitionScheme': 'min_spiffs'})
assert a != b
def test_board_options_order_does_not_matter() -> None:
# The hash sorts keys so option-order doesn't perturb dedup.
a = _job_key(_files(), 'esp32:esp32:esp32',
board_options={'partitionScheme': 'huge_app', 'cpuFreqMHz': 240})
b = _job_key(_files(), 'esp32:esp32:esp32',
board_options={'cpuFreqMHz': 240, 'partitionScheme': 'huge_app'})
assert a == b
def test_spiffs_files_change_changes_key() -> None:
a = _job_key(_files(), 'esp32:esp32:esp32',
spiffs_files=[{'name': 'a.txt', 'content_b64': 'aGVsbG8='}])
b = _job_key(_files(), 'esp32:esp32:esp32',
spiffs_files=[{'name': 'a.txt', 'content_b64': 'd29ybGQ='}])
assert a != b
def test_spiffs_files_order_does_not_matter() -> None:
files1 = [
{'name': 'a.txt', 'content_b64': 'YQ=='},
{'name': 'b.txt', 'content_b64': 'Yg=='},
]
files2 = [
{'name': 'b.txt', 'content_b64': 'Yg=='},
{'name': 'a.txt', 'content_b64': 'YQ=='},
]
assert _job_key(_files(), 'esp32:esp32:esp32', spiffs_files=files1) == \
_job_key(_files(), 'esp32:esp32:esp32', spiffs_files=files2)
def test_no_options_no_spiffs_legacy_key() -> None:
# Backwards-compat: calling without the new kwargs yields the same key
# as explicit None — pre-feature clients keep working.
a = _job_key(_files(), 'esp32:esp32:esp32')
b = _job_key(_files(), 'esp32:esp32:esp32', board_options=None, spiffs_files=None)
assert a == b