I am trying to write a simple unit test for a utility function in my Firebase cloud functions. The test suite fails showing an error with the “firebase-functions” package, however I am not using and or testing anything Firebase related in this test. Not sure why the Vitest is failing. Any help is greatly appreciated.
Function being tested:
/**
* Post a tweet to the user's Twitter account.
*
* @param {string} authHeader
* @param {Tweet} tweet
* @return {*} {Promise<string>} The tweet ID.
*/
export async function postTweet(authHeader: string, tweet: Tweet): Promise<string> {
const response = await axios
.post(
'https://api.twitter.com/2/tweets',
{ text: tweet.text },
{
headers: {
Authorization: authHeader,
'Content-Type': 'application/json',
},
}
)
.catch((error) => {
const twitterError = isTwitterError(error);
if (twitterError) {
throw twitterError;
}
throwUnknownAxiosError(error, 'Failed to post tweet');
});
logger.info('Tweet posted', { responseData: response.data });
return response.data.data.id;
}
Test file:
import { describe, it, expect, vi, beforeEach, MockedFunction } from 'vitest';
import axios from 'axios';
import { postTweet } from './twitter';
import { Tweet, TweetType } from './models/twitter';
import { Timestamp } from 'firebase-admin/firestore';
vi.mock('axios');
describe('postTweet', () => {
const mockAuthHeader = 'Bearer mock-token';
const mockTweet: Tweet = {
text: 'Test tweet',
id: 'tweet1',
createdAt: Timestamp.fromDate(new Date()),
lastSentAt: Timestamp.fromDate(new Date()),
type: TweetType.Starting,
userId: 'user123',
};
beforeEach(() => {
vi.resetAllMocks();
});
it('throws an error if a duplicate tweet is sent', async () => {
const mockError = {
response: {
data: {
errors: [{ code: 187, message: 'Status is a duplicate.' }],
},
},
};
(axios.post as MockedFunction<typeof axios.post>).mockRejectedValueOnce(mockError);
await expect(postTweet(mockAuthHeader, mockTweet)).rejects.toThrow('Status is a duplicate.');
});
});
Error being thrown:
FAIL src/twitter.spec.ts [ src/twitter.spec.ts ]
Error: Missing "./lib/common/providers/identity" specifier in "firebase-functions" package
❯ e node_modules/vite/dist/node/chunks/dep-DG6Lorbi.js:45978:25
❯ n node_modules/vite/dist/node/chunks/dep-DG6Lorbi.js:45978:627
❯ o node_modules/vite/dist/node/chunks/dep-DG6Lorbi.js:45978:1297
❯ resolveExportsOrImports node_modules/vite/dist/node/chunks/dep-DG6Lorbi.js:46599:18
❯ resolveDeepImport node_modules/vite/dist/node/chunks/dep-DG6Lorbi.js:46622:25
❯ tryNodeResolve node_modules/vite/dist/node/chunks/dep-DG6Lorbi.js:46387:16
❯ ResolveIdContext.resolveId node_modules/vite/dist/node/chunks/dep-DG6Lorbi.js:46137:19
❯ PluginContainer.resolveId node_modules/vite/dist/node/chunks/dep-DG6Lorbi.js:48952:17
❯ TransformPluginContext.resolve node_modules/vite/dist/node/chunks/dep-DG6Lorbi.js:49112:15
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯