Тест Puppeteer/Jest для расширения Firebase истекает время ожидания документа Firestore, созданного облачной функцией onJavascript

Форум по Javascript
Ответить
Anonymous
 Тест Puppeteer/Jest для расширения Firebase истекает время ожидания документа Firestore, созданного облачной функцией on

Сообщение Anonymous »

Я тестирую расширение Chrome (Manifest V3) с помощью Jest и Puppeteer. Расширение использует аутентификацию Firebase и Firestore.
Цель:
Мой тест должен зарегистрировать нового пользователя, дождаться, пока серверная облачная функция создаст документ его профиля в Firestore, а затем выполнить действия от имени этого пользователя.
Проблема:
Моя облачная функция onUserCreate успешно запускается, когда пользователь зарегистрирован (я проверил это вручную и проверив База данных Firestore — документ /Users/{uid} создан правильно).
Однако цикл опроса моего тестового сценария, который неоднократно вызывает функцию getUserProfile для проверки этого документа, постоянно не может найти его и в конечном итоге истекает время ожидания.
Почему клиентский запрос .get() из теста Puppeteer не может найти документ, который был успешно создан облачная функция несколько минут назад? Может ли это быть проблема с согласованностью Firestore, характерная для тестовой среды, или проблема с тем, как состояние аутентификации обрабатывается клиентским SDK в этом контексте?
Я подтвердил, что для моего проекта Google Cloud включена оплата и проект включен в план Blaze.
Я уже пробовал реализовать цикл опроса для ожидания документа, как предлагалось в аналогичных вопросах, но тест все еще раз out.
Вот соответствующий код:
  • Облачная функция (functions/index.js):
exports.initializeNewUser = functions.auth.user().onCreate(async (user) => {
const db = admin.firestore();
const settingsDoc = await db.collection("settings").doc("trustScoreRules").get();
const initialScore = settingsDoc.exists ? settingsDoc.data().initialScoreTom : 3;
const newUserProfile = {
email: user.email,
trustScore: initialScore,
// ... other fields
};
return db.collection("Users").doc(user.uid).set(newUserProfile);
});
  • Логика опроса тестового сценария (tests/extension.test.js):
// This happens inside a beforeAll block
// ... after user is successfully registered and signed in ...

let userProfile = null;
for (let i = 0; i < 10; i++) {
const response = await worker.evaluate(async () => {
return new Promise((resolve) => {
chrome.runtime.sendMessage(
{ type: 'getUserProfile', target: 'background' },
(response) => { resolve(response); }
);
});
});
if (response && response.success) {
userProfile = response.profile;
break;
}
await new Promise(resolve => setTimeout(resolve, 1000));
}
if (!userProfile) {
throw new Error("Timed out waiting for user profile to be created...");
}
  • Логика выборки на стороне клиента (offscreen.js):
case 'getUserProfile': {
const unsubscribe = auth.onAuthStateChanged(user => {
unsubscribe();
if (user) {
db.collection('Users').doc(user.uid).get()
.then(doc => {
if (doc.exists) {
sendResponse({ success: true, profile: doc.data() });
} else {
sendResponse({ success: false, error: "User profile not found." });
}
})
} else {
sendResponse({ success: false, error: "User not authenticated." });
}
});
return true;
}

В результате новый пользователь действительно был создан в Firestore и Firebase Authentication, но не прошел два из трех тестов. Вот вывод терминала:


> anotato-extension@1.0.0 test
> NODE_OPTIONS=--experimental-vm-modules jest

(node:2283) ExperimentalWarning: VM Modules is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
FAIL tests/extension.test.js (12.447 s)
Anotato Extension Tests
Extension Loading
✓ should load the extension and find the service worker (2 ms)
User Actions
✕ should show a signed-in state in the popup
✕ should allow a signed-in user to create an annotation

● Anotato Extension Tests › User Actions › should show a signed-in state in the popup

Timed out waiting for user profile to be created by Cloud Function.

83 | }
84 | if (!userProfile) {
> 85 | throw new Error("Timed out waiting for user profile to be created by Cloud Function.");
| ^
86 | }
87 | });
88 |

at Object. (tests/extension.test.js:85:15)

● Anotato Extension Tests › User Actions › should allow a signed-in user to create an annotation

Timed out waiting for user profile to be created by Cloud Function.

83 | }
84 | if (!userProfile) {
> 85 | throw new Error("Timed out waiting for user profile to be created by Cloud Function.");
| ^
86 | }
87 | });
88 |

at Object. (tests/extension.test.js:85:15)

Test Suites: 1 failed, 1 total
Tests: 2 failed, 1 passed, 3 total
Snapshots: 0 total
Time: 14.223 s
Ran all test suites.


Подробнее здесь: https://stackoverflow.com/questions/797 ... tore-docum
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»