1- import { describe , it , expect , vi , beforeEach } from 'vitest' ;
2- import { generateChartUrl , generateMap , httpPost , CHART_TYPE_MAP } from '../skills/chart-visualization/scripts/generate.js' ;
3-
4- // Mock global fetch
5- global . fetch = vi . fn ( ) ;
1+ import { describe , it , expect } from 'vitest' ;
2+ import { generateChartUrl , generateMap , CHART_TYPE_MAP } from '../skills/chart-visualization/scripts/generate.js' ;
63
74describe ( 'generate.js - Chart Visualization Script' , ( ) => {
8- beforeEach ( ( ) => {
9- vi . clearAllMocks ( ) ;
10- } ) ;
11-
125 describe ( 'CHART_TYPE_MAP' , ( ) => {
136 it ( 'should contain all expected chart types' , ( ) => {
147 expect ( CHART_TYPE_MAP ) . toHaveProperty ( 'generate_line_chart' , 'line' ) ;
@@ -31,122 +24,115 @@ describe('generate.js - Chart Visualization Script', () => {
3124 } ) ;
3225 } ) ;
3326
34- describe ( 'httpPost' , ( ) => {
35- it ( 'should make POST request with correct payload' , async ( ) => {
36- const mockResponse = { success : true , data : 'test' } ;
37- global . fetch . mockResolvedValueOnce ( {
38- ok : true ,
39- json : async ( ) => mockResponse ,
40- } ) ;
41-
42- const result = await httpPost ( 'https://example.com' , { test : 'data' } ) ;
43-
44- expect ( global . fetch ) . toHaveBeenCalledWith ( 'https://example.com' , {
45- method : 'POST' ,
46- headers : {
47- 'Content-Type' : 'application/json' ,
48- } ,
49- body : JSON . stringify ( { test : 'data' } ) ,
50- } ) ;
51- expect ( result ) . toEqual ( mockResponse ) ;
52- } ) ;
53-
54- it ( 'should throw error on failed request' , async ( ) => {
55- global . fetch . mockResolvedValueOnce ( {
56- ok : false ,
57- status : 404 ,
58- text : async ( ) => 'Not found' ,
27+ describe ( 'generateChartUrl - Real API Tests' , ( ) => {
28+ it ( 'should generate line chart with real data' , async ( ) => {
29+ // Real data from generate_line_chart.md reference
30+ const lineChartData = [
31+ { time : '2025-01-01' , value : 100 } ,
32+ { time : '2025-01-02' , value : 120 } ,
33+ { time : '2025-01-03' , value : 110 } ,
34+ { time : '2025-01-04' , value : 140 } ,
35+ { time : '2025-01-05' , value : 130 } ,
36+ ] ;
37+
38+ const result = await generateChartUrl ( 'line' , {
39+ data : lineChartData ,
40+ title : 'Test Line Chart' ,
5941 } ) ;
6042
61- await expect ( httpPost ( 'https://example.com' , { } ) ) . rejects . toThrow ( 'HTTP 404: Not found' ) ;
62- } ) ;
63- } ) ;
64-
65- describe ( 'generateChartUrl' , ( ) => {
66- it ( 'should generate chart URL successfully' , async ( ) => {
67- const mockResponse = {
68- success : true ,
69- resultObj : 'https://example.com/chart.png' ,
70- } ;
71- global . fetch . mockResolvedValueOnce ( {
72- ok : true ,
73- json : async ( ) => mockResponse ,
43+ expect ( result ) . toBeDefined ( ) ;
44+ expect ( typeof result ) . toBe ( 'string' ) ;
45+ // Result should be a URL
46+ expect ( result ) . toMatch ( / ^ h t t p s ? : \/ \/ / ) ;
47+ } , 10000 ) ;
48+
49+ it ( 'should generate pie chart with real data' , async ( ) => {
50+ // Real data from generate_pie_chart.md reference
51+ const pieChartData = [
52+ { category : 'Product A' , value : 30 } ,
53+ { category : 'Product B' , value : 25 } ,
54+ { category : 'Product C' , value : 20 } ,
55+ { category : 'Product D' , value : 15 } ,
56+ { category : 'Product E' , value : 10 } ,
57+ ] ;
58+
59+ const result = await generateChartUrl ( 'pie' , {
60+ data : pieChartData ,
61+ title : 'Market Share' ,
7462 } ) ;
7563
76- const result = await generateChartUrl ( 'line' , { data : [ 1 , 2 , 3 ] } ) ;
77-
78- expect ( result ) . toBe ( 'https://example.com/chart.png' ) ;
79- const callArgs = global . fetch . mock . calls [ 0 ] [ 1 ] ;
80- const payload = JSON . parse ( callArgs . body ) ;
81- expect ( payload . type ) . toBe ( 'line' ) ;
82- expect ( payload . source ) . toBe ( 'chart-visualization-creator' ) ;
83- expect ( payload . data ) . toEqual ( [ 1 , 2 , 3 ] ) ;
84- } ) ;
85-
86- it ( 'should throw error when API returns success: false' , async ( ) => {
87- global . fetch . mockResolvedValueOnce ( {
88- ok : true ,
89- json : async ( ) => ( { success : false , errorMessage : 'Test error' } ) ,
64+ expect ( result ) . toBeDefined ( ) ;
65+ expect ( typeof result ) . toBe ( 'string' ) ;
66+ expect ( result ) . toMatch ( / ^ h t t p s ? : \/ \/ / ) ;
67+ } , 10000 ) ;
68+
69+ it ( 'should generate bar chart with real data' , async ( ) => {
70+ const barChartData = [
71+ { category : 'Category A' , value : 45 } ,
72+ { category : 'Category B' , value : 60 } ,
73+ { category : 'Category C' , value : 35 } ,
74+ { category : 'Category D' , value : 50 } ,
75+ ] ;
76+
77+ const result = await generateChartUrl ( 'bar' , {
78+ data : barChartData ,
79+ title : 'Comparison Chart' ,
9080 } ) ;
9181
92- await expect ( generateChartUrl ( 'line' , { } ) ) . rejects . toThrow ( 'Test error' ) ;
93- } ) ;
94-
95- it ( 'should throw error with default message when errorMessage is missing' , async ( ) => {
96- global . fetch . mockResolvedValueOnce ( {
97- ok : true ,
98- json : async ( ) => ( { success : false } ) ,
82+ expect ( result ) . toBeDefined ( ) ;
83+ expect ( typeof result ) . toBe ( 'string' ) ;
84+ expect ( result ) . toMatch ( / ^ h t t p s ? : \/ \/ / ) ;
85+ } , 10000 ) ;
86+
87+ it ( 'should generate area chart with real data' , async ( ) => {
88+ const areaChartData = [
89+ { time : '2025-01' , value : 1000 } ,
90+ { time : '2025-02' , value : 1200 } ,
91+ { time : '2025-03' , value : 1100 } ,
92+ { time : '2025-04' , value : 1400 } ,
93+ ] ;
94+
95+ const result = await generateChartUrl ( 'area' , {
96+ data : areaChartData ,
97+ title : 'Cumulative Trend' ,
9998 } ) ;
10099
101- await expect ( generateChartUrl ( 'line' , { } ) ) . rejects . toThrow ( 'Unknown error' ) ;
102- } ) ;
100+ expect ( result ) . toBeDefined ( ) ;
101+ expect ( typeof result ) . toBe ( 'string' ) ;
102+ expect ( result ) . toMatch ( / ^ h t t p s ? : \/ \/ / ) ;
103+ } , 10000 ) ;
103104 } ) ;
104105
105- describe ( 'generateMap' , ( ) => {
106- it ( 'should generate map successfully' , async ( ) => {
107- const mockResponse = {
108- success : true ,
109- resultObj : { content : [ { type : 'text' , text : 'Map URL' } ] } ,
106+ describe ( 'generateMap - Real API Tests' , ( ) => {
107+ it ( 'should generate district map with real data' , async ( ) => {
108+ const districtMapData = {
109+ region : 'china' ,
110+ data : [
111+ { name : '北京' , value : 100 } ,
112+ { name : '上海' , value : 120 } ,
113+ { name : '广东' , value : 150 } ,
114+ ] ,
110115 } ;
111- global . fetch . mockResolvedValueOnce ( {
112- ok : true ,
113- json : async ( ) => mockResponse ,
114- } ) ;
115-
116- const result = await generateMap ( 'generate_district_map' , { region : 'test' } ) ;
117116
118- expect ( result ) . toEqual ( { content : [ { type : 'text' , text : 'Map URL' } ] } ) ;
119- const callArgs = global . fetch . mock . calls [ 0 ] [ 1 ] ;
120- const payload = JSON . parse ( callArgs . body ) ;
121- expect ( payload . tool ) . toBe ( 'generate_district_map' ) ;
122- expect ( payload . source ) . toBe ( 'chart-visualization-creator' ) ;
123- expect ( payload . input ) . toEqual ( { region : 'test' } ) ;
124- } ) ;
125-
126- it ( 'should include serviceId when available' , async ( ) => {
127- process . env . SERVICE_ID = 'test-service-id' ;
128-
129- global . fetch . mockResolvedValueOnce ( {
130- ok : true ,
131- json : async ( ) => ( { success : true , resultObj : { } } ) ,
132- } ) ;
117+ const result = await generateMap ( 'generate_district_map' , districtMapData ) ;
133118
134- await generateMap ( 'generate_pin_map' , { } ) ;
119+ expect ( result ) . toBeDefined ( ) ;
120+ // The result should contain map visualization data
121+ expect ( result ) . toHaveProperty ( 'content' ) ;
122+ } , 10000 ) ;
135123
136- const callArgs = global . fetch . mock . calls [ 0 ] [ 1 ] ;
137- const payload = JSON . parse ( callArgs . body ) ;
138- expect ( payload . serviceId ) . toBe ( 'test-service-id' ) ;
139-
140- delete process . env . SERVICE_ID ;
141- } ) ;
124+ it ( 'should generate pin map with real data' , async ( ) => {
125+ const pinMapData = {
126+ points : [
127+ { name : 'Location 1' , lat : 39.9 , lng : 116.4 , value : 100 } ,
128+ { name : 'Location 2' , lat : 31.2 , lng : 121.5 , value : 150 } ,
129+ ] ,
130+ } ;
142131
143- it ( 'should throw error when API returns success: false' , async ( ) => {
144- global . fetch . mockResolvedValueOnce ( {
145- ok : true ,
146- json : async ( ) => ( { success : false , errorMessage : 'Map generation failed' } ) ,
147- } ) ;
132+ const result = await generateMap ( 'generate_pin_map' , pinMapData ) ;
148133
149- await expect ( generateMap ( 'generate_district_map' , { } ) ) . rejects . toThrow ( 'Map generation failed' ) ;
150- } ) ;
134+ expect ( result ) . toBeDefined ( ) ;
135+ expect ( result ) . toHaveProperty ( 'content' ) ;
136+ } , 10000 ) ;
151137 } ) ;
152138} ) ;
0 commit comments