Правило поля метки времени модульного тестирования в правилах безопасности firestore

# #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. Существует две перегрузки метода обновления. Один, который вы предложили, другой, который я использовал. Ознакомьтесь со ссылкой