@@ -2,44 +2,28 @@ import lyrics from './index';
22import Slack from '../lib/slackMock' ;
33import axios from 'axios' ;
44import type { AxiosResponse } from 'axios' ;
5- import { stripIndent } from 'common-tags' ;
5+ import { stripIndent , oneLineTrim } from 'common-tags' ;
66
7- vi . mock ( 'scrape-it' , async ( importOriginal ) => {
8- const actual = await importOriginal < typeof import ( 'scrape-it' ) > ( ) ;
9- const { scrapeHTML} = actual ;
10- const searchHtml = [
11- '<html><body><dl id="search_list">' ,
12- '<dt><span><a href="/song/159792/">とまどい→レシピ</a></span>' ,
13- '<a>みかくにんぐッ!</a>(作詞:<a>Junky</a>/作曲:<a>Junky</a>)</dt>' ,
14- '<dd></dd></dl></body></html>' ,
15- ] . join ( '' ) ;
16- const songHtml = [
17- '<html><head><link rel="canonical" href="https://www.uta-net.com/song/159792/"></head>' ,
18- '<body><div id="main"><div class="row"><div><div><div><div>' ,
19- '<h2>とまどい→レシピ</h2>' ,
20- '<h3><a><span itemprop="byArtist name">みかくにんぐッ!</span></a></h3>' ,
21- '</div><div></div><div><p class="detail">' ,
22- '作詞:<a href="/lyricist/7740/" itemprop="lyricist">Junky</a><br>' ,
23- '作曲:<a href="/composer/9401/" itemprop="composer">Junky</a><br>' ,
24- '</p></div></div></div></div></div>' ,
25- '<div id="kashi"><div><div id="kashi_area">' ,
26- '略<br><br>' ,
27- '朝目が覚めたらもう昨日みたいな日常はなくて<br>' ,
28- '「ホントあぁもう...えっとどうしよう」<br>' ,
29- 'ため息混じりに練るお菓子と妄想のレシピの中に<br>' ,
30- '恋心入っちゃった<br><br>' ,
31- '略</div></div></div></div></body></html>' ,
32- ] . join ( '' ) ;
33- return {
34- default : vi . fn ( async ( url : any , opts : any ) => {
35- if ( String ( url ) . includes ( 'index_search' ) ) return { data : scrapeHTML ( searchHtml , opts ) } ;
36- if ( String ( url ) . includes ( '/song/' ) ) return { data : scrapeHTML ( songHtml , opts ) } ;
37- return { data : { } } ;
38- } ) ,
39- scrapeHTML,
7+ vi . mock ( 'axios' ) ;
8+
9+ // scrape-itはCJSのrequire経由でaxiosを呼ぶため、ESMモックが届かない。
10+ // そのためscrape-itをモックし、内部でモック済みaxiosを使って同じURLルーティングを通す。
11+ vi . mock ( 'scrape-it' , async ( ) => {
12+ const { load} = await vi . importActual < typeof import ( 'cheerio' ) > ( 'cheerio' ) ;
13+ const { default : axiosFn } = await import ( 'axios' ) ;
14+ const scrapeItCoreModule = await vi . importActual < any > ( 'scrape-it-core' ) ;
15+ const scrapeHTML : ( $ : any , opts : any ) => any =
16+ typeof scrapeItCoreModule === 'function' ? scrapeItCoreModule : scrapeItCoreModule . default ;
17+
18+ const scrapeIt = async < T > ( url : string , opts : object ) : Promise < { data : T } > => {
19+ const res = await axiosFn ( url ) as { data : string } ;
20+ const $ = load ( res . data ) ;
21+ return { data : scrapeHTML ( $ , opts ) as T } ;
4022 } ;
23+ ( scrapeIt as any ) . scrapeHTML = scrapeHTML ;
24+
25+ return { default : scrapeIt } ;
4126} ) ;
42- vi . mock ( 'axios' ) ;
4327
4428let slack : Slack = null ;
4529
@@ -51,8 +35,55 @@ beforeEach(async () => {
5135
5236describe ( 'lyrics' , ( ) => {
5337 it ( 'responds to @lyrics query' , async ( ) => {
38+ const searchHtml = oneLineTrim `
39+ <html><body><dl id="search_list">
40+ <dt>
41+ <span><a href="/song/159792/">とまどい→レシピ</a></span>
42+ <a>みかくにんぐッ!</a> (作詞:<a>Junky</a>/作曲:<a>Junky</a>)
43+ </dt>
44+ <dd></dd>
45+ </dl></body></html>` ;
46+ const songHtml = oneLineTrim `
47+ <html><head>
48+ <link rel="canonical" href="https://www.uta-net.com/song/159792/">
49+ </head><body><div id="main">
50+ <div class="row"><div><div><div>
51+ <div>
52+ <h2>とまどい→レシピ</h2>
53+ <h3><a><span itemprop="byArtist name">みかくにんぐッ!</span></a></h3>
54+ </div>
55+ <div></div>
56+ <div>
57+ <p>未確認で進行形 オープニング</p>
58+ <p class="detail">
59+ 作詞:<a href="/lyricist/7740/" itemprop="lyricist">Junky</a><br>
60+ 作曲:<a href="/composer/9401/" itemprop="composer">Junky</a><br>
61+ 発売日:2014/02/19<br> この曲の表示回数:106,837回
62+ </p>
63+ </div>
64+ </div></div></div></div>
65+ <div id="kashi"><div><div id="kashi_area">
66+ 略
67+ <br><br>
68+ 朝目が覚めたらもう昨日みたいな日常はなくて
69+ <br>
70+ 「ホントあぁもう...えっとどうしよう」
71+ <br>
72+ ため息混じりに練るお菓子と妄想のレシピの中に
73+ <br>
74+ 恋心入っちゃった
75+ <br><br>
76+ 略
77+ </div></div></div>
78+ </div></body></html>` ;
5479 const mockAxios = vi . mocked ( axios ) ;
5580 mockAxios . mockImplementation ( async ( url : string ) => {
81+ if ( url . includes ( 'index_search' ) ) {
82+ return { data : searchHtml } as AxiosResponse ;
83+ }
84+ if ( url . includes ( 'song' ) ) {
85+ return { data : songHtml } as AxiosResponse ;
86+ }
5687 if ( url . includes ( 'itunes' ) ) {
5788 return { data : {
5889 resultCount : 1 ,
0 commit comments