Миграция тестов RPC-аутентификации
Обзор
Этот документ описывает миграцию тестов из пакета @steemit/rpc-auth в steem-js v1.0.11.
Детали миграции
Источник
- Исходный пакет:
@steemit/rpc-authv1.1.1 - Расположение исходников: локальная копия репозитория
rpc-auth - Исходный файл тестов:
test/index.ts - Тестовый фреймворк: Mocha
Приёмник
- Целевой пакет:
@steemit/steem-jsv1.0.11 - Целевое расположение: локальная копия репозитория
steem-js - Новый файл тестов:
test/rpc-auth.test.ts - Тестовый фреймворк: Vitest
Внесённые изменения
1. Миграция тестового фреймворка
С Mocha:
import 'mocha'
import * as assert from 'assert'
describe('rpc auth', function() {
it('signs and validates', async function() {
assert.equal(...)
})
})На Vitest:
import { describe, it, expect } from 'vitest'
describe('RPC Auth', () => {
it('should sign and validate a request', async () => {
expect(...).toBe(...)
})
})2. Обновление зависимостей
Удалено:
dsteem(старая библиотека steem-js)node-fetch(для создания аккаунтов в тестовой сети)- специфичные для Mocha утилиты
Заменено на:
- собственный API
steem-js(steem.auth,steem.api) - нативный
crypto.randomBytes - ассерты Vitest
3. Работа с тестовыми аккаунтами
Раньше:
- Аккаунты тестовой сети создавались динамически
- Использовался
dsteem.Client.testnet() - Требовался доступ к сети
Теперь:
- Используются переменные окружения или тестовые ключи
- Динамическое создание аккаунтов отсутствует
- Большинство тестов может работать без сети
4. Функция проверки
Раньше:
const dsteemVerify: VerifyMessage = async (message, signatures, account) => {
const opts = { hash: message, signatures, required_posting: [account] }
const rv = await client.database.call('verify_signatures', [opts])
if (rv.valid !== true) throw new Error('Signature invalid')
}Теперь:
const createVerifyFunction = () => {
return async (message: Buffer, signatures: string[], account: string) => {
const accounts = await api.getAccountsAsync([account])
const postingKeys = accounts[0].posting?.key_auths?.map(k => k[0]) || []
// Verify using steem-js Signature and PublicKey classes
}
}Покрытие тестами
Мигрированные тесты
✅ sign and validate - базовый сценарий подписи и валидации ✅ invalid requests - исчерпывающие тесты обработки ошибок:
- Некорректный JSON RPC-запрос
- Отсутствует подписанная нагрузка
- Некорректные параметры запроса
- Отсутствует аккаунт
- Некорректные закодированные параметры
- Некорректный nonce (несколько случаев)
- Некорректная метка времени
- Истёкшая подпись
- Ошибка проверки
✅ signing errors - обработка ошибок при подписи:
- Отсутствуют params
- Пустой массив ключей
✅ signature format - валидация структуры подписи:
- Корректный формат подписи
- Уникальные nonce
- Корректные метки времени
✅ multiple signatures - поддержка нескольких ключей
Пропущенные тесты
⏭️ invalid signatures (интеграционный тест) - требуется:
- Реальный аккаунт в тестовой сети
- Доступ к сети
- Включается переменными окружения
STEEM_USERNAMEиSTEEM_PASSWORD
Результаты тестов
✓ test/rpc-auth.test.ts (19 tests | 1 skipped)
✓ RPC Auth > sign and validate > should sign and validate a request
✓ RPC Auth > invalid requests > should handle invalid JSON RPC request
✓ RPC Auth > invalid requests > should handle missing signed payload
✓ RPC Auth > invalid requests > should handle invalid request params
✓ RPC Auth > invalid requests > should handle missing account
✓ RPC Auth > invalid requests > should handle invalid encoded params
✓ RPC Auth > invalid requests > should handle invalid nonce (not a string)
✓ RPC Auth > invalid requests > should handle invalid nonce (wrong length)
✓ RPC Auth > invalid requests > should handle invalid nonce (wrong format)
✓ RPC Auth > invalid requests > should handle invalid timestamp
✓ RPC Auth > invalid requests > should handle expired signature
✓ RPC Auth > invalid requests > should handle verification failure
✓ RPC Auth > signing errors > should handle invalid requests when signing
✓ RPC Auth > signing errors > should handle empty keys array
✓ RPC Auth > signature format > should generate valid signature format
✓ RPC Auth > signature format > should generate unique nonces for each request
✓ RPC Auth > signature format > should generate valid timestamps
✓ RPC Auth > multiple signatures > should support multiple keys
↓ RPC Auth > invalid signatures > should handle invalid signatures (integration test)Ключевые отличия
Формат сообщений об ошибках
Исходный rpc-auth:
ValidationError: Verification failed (Nope)steem-js v1.0.11:
Error: Verification failed: NopeФормат ошибки изменился с (message) на : message, что отражено в тестах.
Изменения API
Работа с PrivateKey:
- Раньше:
PrivateKey.from(key)илиPrivateKey.fromString(key) - Теперь:
PrivateKey.fromWif(key)
- Раньше:
Создание подписи:
- Раньше:
key.sign(message.buffer), затемhexify() - Теперь:
Signature.signBufferSha256(message, privateKey), затем.toHex()
- Раньше:
Класса ValidationError больше нет:
- Раньше: собственный класс
ValidationError - Теперь: стандартный
Errorс форматированными сообщениями
- Раньше: собственный класс
Запуск тестов
# Run all rpc-auth tests
pnpm test -- rpc-auth.test.ts
# Run with coverage
pnpm test:coverage -- rpc-auth.test.ts
# Run specific test
pnpm test -- rpc-auth.test.ts -t "should sign and validate"Настройка интеграционного теста
Чтобы запустить пропущенный интеграционный тест, задайте переменные окружения:
export STEEM_USERNAME="your-testnet-account"
export STEEM_PASSWORD="your-password"
pnpm test -- rpc-auth.test.tsПримечания
- Все тесты основной функциональности успешно мигрированы
- Набор тестов сохраняет то же покрытие, что и исходный
- Интеграционные тесты по умолчанию пропускаются, но их можно включить
- Тесты совместимы с vitest и современным TypeScript
- Для большинства тестов внешние зависимости не требуются
Мигрировано из документации репозитория steem-js; демонстрация задействованных здесь утилит проверки — в разделе Подписанные вызовы и проверка подписи.