# #typescript #firebase #google-cloud-firestore #firebase-security
Вопрос:
Я пишу модульные тесты для своих правил безопасности firestore, используя node.js библиотека @firebase/rules-unit-testing
Вот мое правило безопасности для обновления документа:
allow update: if request.auth.uid != null amp;amp;
request.auth.uid == userId amp;amp;
request.resource.data.updatedAt == request.time;
Я хочу updatedAt
, чтобы поле всегда было установлено на FieldValue.serverTimestamp()
.
В своем модульном тесте я пытаюсь обновить значение FieldValue.serverTimestamp()
и проверить, что оно должно быть успешным. Вот мой фрагмент кода:
let testEnvironment: RulesTestEnvironment = await initializeTestEnvironment({
projectId: PROJECT_ID,
firestore: {
rules: fs.readFileSync("../firestore.rules", "utf8"),
host: "localhost",
port: 8080
}
})
const firestore = testEnvironment.authenticatedContext("user_123").firestore()
const testDoc = firestore.doc("/writers/user_123")
await assertSucceeds(testDoc.update(
"some_field", "some_value", "updatedAt", firestore.FieldValue.serverTimestamp()
))
В данном случае firestore.FieldValue
не определено.
Я попытался использовать SDK администратора firebase-admin
, изменив последнее утверждение на:
await assertSucceeds(testDoc.update(
"some_field", "some_value", "updatedAt", admin.firestore.FieldValue.serverTimestamp()
))
За это я получаю ошибку-
Ошибка FirebaseError: Функция DocumentReference.update() вызывается с недопустимыми данными. Неподдерживаемое значение поля: пользовательский объект (найден в поле updatedAt в разделе авторы документов/user_123)
Кто-нибудь может подсказать, как добавить тесты для обновления поля метки времени?
Ответ №1:
Передаваемые вами данные неправильно отформатированы
Попробуйте это:
await assertSucceeds(testDoc.update(
{some_field: "some_value", updatedAt: admin.firestore.FieldValue.serverTimestamp()})
Комментарии:
1. Существует две перегрузки метода обновления. Один, который вы предложили, другой, который я использовал. Ознакомьтесь со ссылкой