feat(specs): обслуживать все четыре спецификации приложением - #20
Merged
Conversation
…нием Курс HTTP API уже собирался из спецификации, а Postman, Playwright и HTTP-протокол оставались за моком prism на данных faker'а. В курсе Postman это ломало урок целиком: `?limit=2` отдавал четыре записи с `limit` равным 10928880, `?skip=3&limit=2` ноль записей, а `/users/3` пользователя 52956988 с латинским именем. Теперь плагин openapi-spec.ts регистрируется по разу на каждую спецификацию, имя приходит параметром из app.config.json. Обработчики одни на все четыре: имена интерфейсов совпадают, значит совпадают и operationId, а js-playwright просто подмножество. Отсутствующий обработчик glue находит на старте и падает громко. В три спецификации добавлены @operationid и подключён @typespec/openapi, без которого декоратор неизвестен. Заодно они приведены к тому же виду, что http-api: skip и limit объявлены uint16 со значениями по умолчанию, у чтения одной записи, обновления и удаления объявлен 404, у создания CreatedResponse. Значения по умолчанию тут не украшение: их применяет валидатор, и без них пагинация не работает вовсе. Скрытая правка одного этого места и была причиной, по которой skip применялся, а limit нет. Создание приведено к 201 во всех четырёх. Три спецификации объявляли обычный ответ, то есть 200, и урок 850-api-testing курса Playwright из-за этого не проходил, хотя учил правильному коду и ассертил 201. BasicAuth добавлен в securityHandlers: задачи курса Postman закрыты именно им, и включая чтение одной задачи. Схема берётся из спецификации, как и остальные. authService у http-protocol удалён. По адресу /http-protocol/login живёт рукописный эндпоинт: курс разбирает отправку формы через telnet и печатает ответ `Done!` с Content-Length 5. Спецификация же описывала выдачу токена, то есть то, чего этот адрес никогда не отдавал, и glue из-за этого падал на дубле маршрута. Моков prism больше нет ни одного, зависимость снята. Caddy направляет все четыре префикса приложению. Отдельно починен адрес документации со слешем на конце: swagger-ui регистрирует на него и GET, и добавленный fastify HEAD, а fastify-allow запоминает по маршруту последний метод, поэтому в Allow оставался только HEAD и браузерный GET получал 405. Ссылка живая, урок crud ведёт на /http-api-openapi/#/Tasks. Нормализуется через redir в Caddy. Прогон вырос до 168 проверок и проверяет все четыре префикса. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Закрывает по существу FEEDBACK-374. Сделано на фундаменте из 187d480: маршруты строятся из спецификации, а не пишутся руками.
Зачем
Курс HTTP API уже собирался из спецификации, а Postman, Playwright и HTTP-протокол оставались за моком prism на данных faker'а. В курсе Postman это ломало урок
200-complex-requestsцеликом:?limit=2— двух первыхlimitв ответе10928880limit2,total10?skip=3&limit=2?skip=3&limit=5/users/3id: 52956988, имяea nulla sed cupidatat nostrudid: 3, Reinhold LangoshЧто сделано
openapi-spec.ts(бывшийhttp-api.ts) стал плагином на одну спецификацию и регистрируется по разу на каждую; имя приходит параметром изapp.config.json, того же списка, что задаёт маршруты документации.Обработчики одни на все четыре: имена интерфейсов совпадают, значит совпадают и
operationId, аjs-playwrightпросто подмножество. Отсутствующий обработчик glue находит на старте и падает громко, поэтому расхождение не будет тихим.В три спецификации добавлены
@operationIdи подключён@typespec/openapi, без которого декоратор неизвестен. Заодно они приведены к видуhttp-api:skipиlimitобъявленыuint16со значениями по умолчанию, у чтения одной записи, обновления и удаления объявлен 404, у созданияCreatedResponse.Про значения по умолчанию отдельно: их применяет валидатор, и без них пагинация не работает вовсе. Ровно это я и наблюдал на промежуточном прогоне —
skipприменялся, аlimitнет.Три настоящих различия, снятых со спецификаций
securityHandlers: задачи курса Postman закрыты именно им, включая чтение одной задачи.850-api-testingкурса Playwright из-за этого не проходил, хотя учил правильному коду и ассертил 201. Выровнены спецификации, а не урок: ни один другой курс на 200 при создании не опирается.authServiceуhttp-protocolудалён. По адресу/http-protocol/loginживёт рукописный эндпоинт: курс разбирает отправку формы через telnet и печатает ответDone!сContent-Length: 5. Спецификация описывала выдачу токена, то есть то, чего этот адрес никогда не отдавал, и glue падал на дубле маршрута.Мока больше нет
Ни одного prism не поднимается, зависимость
@stoplight/prism-cliснята, Caddy направляет все четыре префикса приложению. Мины прибитой версии (точная5.14.2, обязательный--multiprocess=false) сохранены вAGENTS.mdна случай возврата.Заодно починен регресс из предыдущей пачки
Адрес документации со слешем на конце отдавал 405 вместо страницы:
swagger-uiрегистрирует на него иGET, и добавленный fastifyHEAD, аfastify-allowзапоминает по маршруту последний метод, поэтому вAllowоставался толькоHEAD. Ссылка живая — урокcrudведёт на/http-api-openapi/#/Tasks, фрагмент после решётки до сервера не доходит. Прод сейчас отдаёт 200, новая сборка отдавала бы 405. Нормализуется четырьмяredirв Caddy.Проверка
make testвырос до 168 проверок: по каждому префиксу пагинация,select, отбор по пути, 404, 405, 422 на отрицательномskip, состав коллекций, схемы авторизации, вложенные ресурсы, код создания.Проверен на способность падать: если снять проверку Basic, падают две проверки postman.
Сверх прогона собран образ и поднят контейнер, запросы шли через Caddy: все четыре префикса, рукописные эндпоинты (
/http-protocol/example,/stream,/removed,/http-protocol,/postman/cookie,/js-playwright/users-list,/js-dom-testing-library/users-list),POST /http-protocol/login→Done!, документация всех четырёх.Правки курсов идут отдельно, после деплоя. Там уже найдено: урок
850-api-testingкурса Playwright запрашивает/js-playwright/post/(такого маршрута нет), аtoMatchObjectв нём сравниваетdataсам с собой.🤖 Generated with Claude Code