Ассоциация производителей КРС голштинской породы

Эволюция продукта

Что проверено, когда и с каким исходом. Зелёное здесь означает «проверено недавно и сошлось»: результат старше полутора суток отмечается как неизвестный, потому что доска, показывающая вчерашнее за нынешнее, хуже отсутствующей.

Последние прогоны

Прод

есть находки

Проверок прогнано 14, с находками 4. Заняло 336.6 с.

· версия 0.16.0-alpha

Что система умеет проверять

Всего проверок 39, из них 5 умеет прогнать само приложение — они и попадают в ночной прогон. Остальные запускаются командой и здесь перечислены, чтобы было видно не только что проверено, но и что нет.

База и выкладка

ПроверкаЧто сверяетКомандаСостояние
Осмотр перед запускомОтвечает ли база, сходится ли журнал миграций со схемой, нет ли отметки dev, долгих транзакций, раздутых таблиц и непроверенных ограниченийnpm run doctorПрод
Присмотр за пулом соединенийУ обрыва соединения ровно один слушатель: без него обрыв убивает процесс, а лишние пишут в лог по копии на каждыйnpm run check:poolещё не гонялась
Индексы против запросовКакие индексы не используются и каких не хватает под настоящую нагрузкуnpm run audit:indexesПрод

Данные книги

ПроверкаЧто сверяетКомандаСостояние
Отчёты по стаду считаютсяСемь запросов выполняются на живой базе и возвращают то, что обещает типnpm run check:herdПрод
Списки сходятся с числамиЧисло в отчёте равно длине списка за ним: несходящееся число хуже ошибки — оно правдоподобно с обеих сторонnpm run check:drilldownПрод
Ассоциация и хозяйство видят одно и то жеСводка по стадам считается группировкой по всем хозяйствам, кабинет — по одному; разойдись они, Ассоциация позвонит про беду, которой хозяйство у себя не видитnpm run check:conditionещё не гонялась
Ревизия зоотехнических правилВсе правила реестра прогоняются по настоящим данным: какие срабатывают, какие молчатnpm run audit:checksПрод
Родословная без противоречийЦиклы в родословной, родители моложе потомков, животное само себе родитель, невозможный возраст родителя — по тем же порогам, что видит экспертnpm run audit:pedigreeПрод
Подбор пар считается верноИнбридинг сверяется на случаях с известным ответом: полусибсы, полные сибсы, отец с дочерьюnpm run check:matingпишет в базу — гоняется только на копии
Сравнение быков со сверстницамиРазница по дочерям считается на построенном контрольном стадеnpm run check:bullsпишет в базу — гоняется только на копии
Приплод сходится сам с собойТип рождения, числа живых и мертворождённых и карточки телят — на выдуманных отёлах, без базыnpm run check:calvingгоняется вручную
Рейтинг не врёт местамиРазряды не пересекаются, порядок не возрастает, совпадения делят место, а отбор по хозяйству мест не сдвигаетnpm run check:rankingгоняется вручную

Доступ и роли

ПроверкаЧто сверяетКомандаСостояние
Чужое закрытоПопытки поднять себе роль и прочитать чужие записи отклоняютсяnpm run check:securityпишет в базу — гоняется только на копии
Уровень достоверности выводится, а не ставитсяПротокол лаборатории поднимает вторую ступень, отзыв её снимает, а подпись Ассоциации ни то ни другое не трогаетnpm run check:trustпишет в базу — гоняется только на копии
Роли, приглашения, блокировкаСотрудник видит своё, приглашение работает один раз, заблокированный не входитnpm run check:teamпишет в базу — гоняется только на копии
Границы хозяйствОт лица настоящего пользователя: не видно и не правится ничего чужогоnpm run audit:tenancyпишет в базу — гоняется только на копии
Точечные доступыВыданный доступ открывает ровно одну запись и отзываетсяnpm run audit:grantsпишет в базу — гоняется только на копии
Заслон подтвержденияНельзя подтвердить запись поверх неразобранной находки и нельзя — при нехватке данных: происхождения, отёлов, контрольных доекnpm run audit:gateПрод
Журнал переживает предметЗапись об операции остаётся после удаления того, о чём онаnpm run check:journalпишет в базу — гоняется только на копии
Сохраняемые отборыОтбор сохраняется, открывается и удаляется, чужой не виденnpm run check:searchesпишет в базу — гоняется только на копии

Обмен и файлы

ПроверкаЧто сверяетКомандаСостояние
Выгрузка и загрузка книги ExcelНастоящее стадо выгружается, читается обратно и сходится с исходнымnpm run check:xlsxпишет в базу — гоняется только на копии
Выгрузка во ФГИАС ПРШапка сходится с настоящим шаблоном, наш ключ не выдаётся за номер реестраnpm run check:fgias-exportгоняется вручную
У пород есть коды ICARБез трёхбуквенного кода порода не уезжает в обмен вовсе, а международный номер собирается коротким: шестнадцать символов вместо девятнадцатиnpm run check:breed-codesгоняется вручную
Международный номер собирается и разбирается верноНастоящие номера из чешских списков быков разбираются; импортное животное считается от страны происхождения; длинный номер не обрезаетсяnpm run check:aiidгоняется вручную
Ресурсы ICAR ADE собираются по спецификацииИмена полей и значения перечислений из стандарта, время в UTC, показатель молока строкой, ноль не выдан за «неизвестно»npm run check:adeгоняется вручную
Кодировки и разделители CSVwindows-1251 и UTF-8, точка с запятой и запятая, круговой прогон разбора и сборкиnpm run check:csvПрод
Смена владельцаЖивотное переходит с историей, прежний владелец теряет доступnpm run check:movementsпишет в базу — гоняется только на копии
Описание API полноеВсе ручки попадают в OpenAPI: описание, разошедшееся с кодом, хуже отсутствующегоnpm run check:openapiПрод

Страницы и ссылки

ПроверкаЧто сверяетКомандаСостояние
Соответствие подтверждается, а не заявляетсяКаждое доказательство на странице соответствия ведёт на существующий прогон, файл или адрес; у «выполнено» и «частично» доказательство обязательноnpm run check:complianceгоняется вручную
Домены разводятся верноВитрина и книга живут на разных доменах одного приложения; ошибка тут не падает, а показывает не то — рекламу вместо кабинетаnpm run check:hostsгоняется вручную
Ссылки не вложены друг в другаВложенные <a> недопустимы по HTML: браузер перестроит разметку по-своему, и жалоба придёт на гидратацию, а не на причинуnpm run check:linksгоняется вручную
Обход всех страницКаждая страница живого сервера отвечает, битых ссылок и переадресаций нетnpm run smokeпропущена
Ссылки навигации ведут куда обещаютВсе пункты меню кабинета открываются на живом сервере с живой базойnpm run check:navпропущена
Страница API открываетсяДокументация отдаётся и её обвязка лежит на местеnpm run check:api-docsпропущена

Код и форматы

ПроверкаЧто сверяетКомандаСостояние
Серверные компоненты не передают функцийПропс-функция через границу «сервер → клиент» роняет сборку, и только её — в разработке страница работаетnpm run check:client-propsгоняется вручную
Переводы полны, а язык определяется как задуманоНи одной пустой строки и ни одного русского абзаца в нерусском языке; Accept-Language разбирается верно, а выбор человека сильнее догадкиnpm run check:i18nгоняется вручную
Хуки коллекций пишут внутри своей транзакцииНи одно обращение к Payload из хука не идёт мимо `req` — иначе не ошибка, а зависаниеnpm run check:hooksгоняется вручную
Порядок частей страницыМеню кабинета стоит выше заголовка на каждой страницеnpm run check:layoutПрод
Даты в четырёх часовых поясахПоказ дат не съезжает на сутки при смене пояса читателяnpm run check:timeПрод

Находки

Родословная без противоречийПрод

Качество книги

Находок: 8. Что именно не сошлось, видно вошедшим: разбор называет номера животных, а это уже данные книги, а не сведения о системе.

npm run audit:pedigree

Чего этот раздел не говорит

  • Зелёное — это «сошлось», а не «работает правильно». Проверки сверяют то, что уже описано: числа с числами, схему с журналом, списки с отчётами. Ошибку, которой никто не придумал проверки, они не увидят.
  • Проверки данных смотрят одно хозяйство — самое большое из заведённых. Расхождение, которое возникает только у другого, здесь не найдётся.
  • Битые внешние ссылки не проверяются вовсе. Обход страниц знает только свои адреса; ссылка на чужой сайт, который закрылся, останется незамеченной.
  • Расхождение документации с кодом не ловит ничего. Описание API сверяется с ручками, а рассказ о процессах в «Документации» — ни с чем.