W projekcie jest sześć skryptów kontrolnych. Wszystkie mają wspólną cechę: powstały po fakcie, każdy po jednej konkretnej wpadce.
check-lazy-config.mjs config czytany leniwie
check-engine-strings.mjs zaden napis dla czytelnika nie stoi w kodzie
check-ui-strings.mjs instancja deklaruje wszystkie znane napisy
check-dates.mjs zaden wpis nie ma golej daty
check-header-classes.mjs naglowek nie rozpycha sie poza ekran
check-header-layout.mjs uklad naglowka po dolozeniu elementuNapisy w kodzie
Silnik ma być niezależny od języka. Brzmi oczywiście, dopóki ktoś nie wpisze słowa „Czytaj" wprost w komponencie — wtedy angielska wersja serwisu dostaje polski przycisk i nikt tego nie widzi, dopóki nie otworzy jej czytelnik.
Wyszukiwanie takich napisów po polskich znakach diakrytycznych nie działa. „Czytaj", „minuty czytania" i typograficzne cudzysłowy nie mają ani jednego ogonka. Strażnik szuka więc po miejscu, nie po zawartości: każdy tekst renderowany dla czytelnika musi pochodzić ze słownika, nie z literału.
Drugi strażnik pilnuje odwrotnej strony: instancja musi zadeklarować wszystkie napisy, które zna silnik. Świadome braki — formy liczby mnogiej, których angielski nie ma — siedzą na liście wyjątków i są tam wymienione z nazwy.
Konfiguracja czytana leniwie
Ten jest najbardziej pouczający. Serwis miał ustawienie wyłączające podpis silnika w stopce. Działało: w wygenerowanym HTML-u nie było ani słowa o silniku.
Ale stała z nazwą i tak jechała do przeglądarki w paczce z kodem, bo warunek sprawdzany jest w czasie wykonania i bundler nie ma jak wyciąć martwej gałęzi. Ktoś, kto otworzyłby narzędzia deweloperskie, znalazłby nazwę, która miała być ukryta.
Strażnik wywala teraz budowanie, gdy konfiguracja jest czytana zachłannie — nawet w komentarzu dokumentacyjnym, bo tam też potrafi trafić do paczki.
Data w przyszłości
Najprostszy i najczęściej ratujący. Wpis z datą, która jeszcze nie nadeszła, nie pojawia się w serwisie — to funkcja, publikacja z wyprzedzeniem. Ale ta sama funkcja zamienia literówkę w godzinie w niewidzialny wpis.
Osobna pułapka: sama data bez godziny czyta się jako północ czasu uniwersalnego, czyli druga w nocy u nas. Wpis z pełnym znacznikiem dodany wieczorem wypada wtedy pod wpisem z samą datą z następnego dnia.
Sprawdziłem to na sobie jeszcze dziś: publikując tekst o pułapkach wdrożeniowych, ustawiłem datę pięć minut w przyszłość i dostałem czterysta cztery.
Co z tego wynika
Wszystkie te skrypty razem to kilkaset linii. Żaden nie jest testem jednostkowym i żaden nie sprawdza logiki — sprawdzają założenia architektoniczne, których kompilator nie widzi.
I to jest chyba właściwy wniosek. Testy pilnują, żeby kod robił to, co ma robić. Strażnicy pilnują, żeby nikt nie przekroczył granicy, która istnieje tylko w głowach zespołu — a po pół roku już nawet nie tam.