@@ -18,36 +18,9 @@ afterAll(() => {
1818 vi . useRealTimers ( ) ;
1919} ) ;
2020
21- // 各プラグインのテストで慣例的に行われているのと同様、実クライアント/実DBに
22- // 接続する共有シングルトンをモック化する。これらは plugin.default(slack) /
23- // plugin.server(slack) に渡す SlackMock とは独立しており、モックしても
24- // Fastify登録クラスのクラッシュ検知という本テストの目的には影響しない。
25- //
26- // lib/discord.ts はガード無しでモジュール読み込み時に
27- // discord.login(process.env.TSGBOT_DISCORD_TOKEN) を実行するため、
28- // 実トークンが環境変数にあると本テストが実際にDiscordへログインしてしまう。
29- // factory無しの automock はモック生成のために実モジュールを一度requireして
30- // しまい副作用(実ログイン)を防げないため、実モジュールを読み込まない
31- // factoryを明示的に渡す。
32- vi . mock ( './discord' , ( ) => {
33- const emitter = new EventEmitter ( ) ;
34- const chainable : any = new Proxy ( ( ) => chainable , {
35- get : ( ) => chainable ,
36- } ) ;
37- return {
38- default : new Proxy ( emitter , {
39- get ( target : any , prop , receiver ) {
40- if ( prop === 'isReady' ) {
41- return ( ) => false ;
42- }
43- if ( prop in target || typeof prop === 'symbol' ) {
44- return Reflect . get ( target , prop , receiver ) ;
45- }
46- return chainable ;
47- } ,
48- } ) ,
49- } ;
50- } ) ;
21+ vi . mock ( './discord' , ( ) => ( {
22+ default : new EventEmitter ( ) ,
23+ } ) ) ;
5124vi . mock ( './slack' , ( ) => ( {
5225 webClient : { } ,
5326 eventClient : { } ,
@@ -58,36 +31,21 @@ vi.mock('./slack', () => ({
5831vi . mock ( './openai' ) ;
5932vi . mock ( './firestore' ) ;
6033vi . mock ( './state' ) ;
61- // lib/mailgun.ts はモジュール読み込み時に無条件で mailgun.client({username, key})
62- // を実行するが、mailgun.js は username が無いと即座に例外を投げる。開発環境の
63- // 実行時は .env 経由で値が入っているため気づきにくいが、CIのようにこれらの
64- // 環境変数が未設定の環境では起動時クラッシュになるため、既存の
65- // mail-hook/index.test.ts と同様にモックする。
6634vi . mock ( './mailgun' , ( ) => ( {
6735 __esModule : true ,
6836 default : {
6937 client : vi . fn ( ) ,
7038 } ,
7139} ) ) ;
72- // hayaoshi/jantama等、複数のプラグインがGoogle Sheets連携にgoogleapisを使う。
73- // 実認証情報が無くても内部で非同期の認証情報探索が走り、そのタイミング次第で
74- // 無関係な後続テストの失敗として現れることを確認したため、まとめてモックする。
75- vi . mock ( 'googleapis' ) ;
40+ vi . mock ( '../achievements' ) ;
7641// dajare/tokenize.js がモジュール読み込み時に無条件で lib/getReading.js の
7742// getReading() を呼び出す。辞書ファイル(lib/bep-ss-2.3/bep-eng.dic)が
7843// 存在しない環境(CI等)では http://www.argv.org から実際にtarballを
7944// ダウンロードしようとして失敗する。lib/__mocks__/getReading.js の
8045// 既存の手動モックを使うことでこれを防ぐ。
8146vi . mock ( '../lib/getReading' ) ;
82- vi . mock ( '../achievements' ) ;
83- // slack-log は default() 内で無条件に slack-log API へ axios.get() する。
84- // 共有axiosモック(空文字列応答)を使い、実ネットワーク接続の
85- // ECONNREFUSEDによる失敗を防ぐ。
47+ vi . mock ( 'googleapis' ) ;
8648vi . mock ( 'axios' ) ;
87-
88- // autogen-quiz, city-symbol 等、一部のプラグインが誤って自モジュール内で
89- // `import 'dotenv/config'` を実行しており、テスト中に .env の実際の
90- // シークレットが process.env に読み込まれてしまう。多重の安全策として無効化する。
9149vi . mock ( 'dotenv/config' , ( ) => ( { } ) ) ;
9250
9351const EXCLUDED_BOTS = new Set ( [
@@ -118,16 +76,13 @@ const EXCLUDED_BOTS = new Set([
11876
11977const testedBots = allBots . filter ( ( name ) => ! EXCLUDED_BOTS . has ( name ) ) ;
12078
121- // PR #1215 (FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER) のように、実際に
122- // fastify.register() するまで顕在化しない起動時クラッシュを検知するためのテスト。
123- // SlackMock だけを使う通常のユニットテストはこのクラスの不具合を検知できない。
12479describe . each ( testedBots ) ( '%s' , ( name ) => {
12580 it ( 'loads without throwing' , async ( ) => {
12681 const slack = new SlackMock ( ) ;
12782 process . env . CHANNEL_SANDBOX = slack . fakeChannel ;
12883 process . env . CHANNEL_GAMES = slack . fakeChannel ;
129- // nmpz はモジュール読み込み時に GOOGLE_MAPS_API_KEY / CLOUDINARY_URL の
130- // 存在を無条件にチェックし、無ければ即座にthrowする。
84+
85+ // nmpz
13186 process . env . GOOGLE_MAPS_API_KEY ||= 'dummy-google-maps-api-key' ;
13287 process . env . CLOUDINARY_URL ||= 'cloudinary://dummy:dummy@dummy' ;
13388
0 commit comments