1+ import { Parser } from '@pgsql/parser' ;
2+ import {
3+ PG13ToPG17Transformer ,
4+ PG14ToPG17Transformer ,
5+ PG15ToPG17Transformer ,
6+ PG16ToPG17Transformer
7+ } from '../src/transformers-direct' ;
8+
9+ describe ( 'Direct Transformers' , ( ) => {
10+ const testSQL = 'SELECT id, name FROM users WHERE active = true' ;
11+
12+ describe ( 'PG16ToPG17Transformer' , ( ) => {
13+ it ( 'should transform PG16 ParseResult to PG17' , async ( ) => {
14+ const pg16Parser = new Parser ( { version : 16 } ) ;
15+
16+ const pg16Ast = await pg16Parser . parse ( testSQL ) ;
17+ const transformer = new PG16ToPG17Transformer ( ) ;
18+ const transformedAst = transformer . transform ( pg16Ast ) ;
19+
20+ expect ( transformedAst . version ) . toBe ( 170004 ) ;
21+ expect ( transformedAst . stmts ) . toBeDefined ( ) ;
22+ expect ( transformedAst . stmts . length ) . toBe ( 1 ) ;
23+
24+ // Verify the structure is preserved
25+ expect ( transformedAst . stmts [ 0 ] . stmt ) . toBeDefined ( ) ;
26+ const stmt = transformedAst . stmts [ 0 ] . stmt as any ;
27+ expect ( stmt . SelectStmt ) . toBeDefined ( ) ;
28+ } ) ;
29+
30+ it ( 'should transform PG16 Node to PG17' , async ( ) => {
31+ const pg16Parser = new Parser ( { version : 16 } ) ;
32+
33+ const pg16Ast = await pg16Parser . parse ( testSQL ) ;
34+ const transformer = new PG16ToPG17Transformer ( ) ;
35+
36+ // Transform just the statement node
37+ const stmtNode = pg16Ast . stmts [ 0 ] . stmt ;
38+ const transformedNode = transformer . transform ( stmtNode ) ;
39+
40+ // Verify the node was transformed
41+ expect ( transformedNode ) . toBeDefined ( ) ;
42+ expect ( ( transformedNode as any ) . SelectStmt ) . toBeDefined ( ) ;
43+ } ) ;
44+ } ) ;
45+
46+ describe ( 'PG15ToPG17Transformer' , ( ) => {
47+ it ( 'should transform PG15 ParseResult to PG17' , async ( ) => {
48+ const pg15Parser = new Parser ( { version : 15 } ) ;
49+
50+ const pg15Ast = await pg15Parser . parse ( testSQL ) ;
51+ const transformer = new PG15ToPG17Transformer ( ) ;
52+ const transformedAst = transformer . transform ( pg15Ast ) ;
53+
54+ expect ( transformedAst . version ) . toBe ( 170004 ) ;
55+ expect ( transformedAst . stmts ) . toBeDefined ( ) ;
56+ expect ( transformedAst . stmts . length ) . toBe ( 1 ) ;
57+
58+ // Verify the structure is preserved
59+ expect ( transformedAst . stmts [ 0 ] . stmt ) . toBeDefined ( ) ;
60+ const stmt = transformedAst . stmts [ 0 ] . stmt as any ;
61+ expect ( stmt . SelectStmt ) . toBeDefined ( ) ;
62+ } ) ;
63+
64+ it ( 'should transform PG15 Node to PG17' , async ( ) => {
65+ const pg15Parser = new Parser ( { version : 15 } ) ;
66+
67+ const pg15Ast = await pg15Parser . parse ( testSQL ) ;
68+ const transformer = new PG15ToPG17Transformer ( ) ;
69+
70+ // Transform just the statement node
71+ const stmtNode = pg15Ast . stmts [ 0 ] . stmt ;
72+ const transformedNode = transformer . transform ( stmtNode ) ;
73+
74+ // Verify the node was transformed
75+ expect ( transformedNode ) . toBeDefined ( ) ;
76+ expect ( ( transformedNode as any ) . SelectStmt ) . toBeDefined ( ) ;
77+ } ) ;
78+ } ) ;
79+
80+ describe ( 'PG14ToPG17Transformer' , ( ) => {
81+ it ( 'should transform PG14 ParseResult to PG17' , async ( ) => {
82+ const pg14Parser = new Parser ( { version : 14 } ) ;
83+
84+ const pg14Ast = await pg14Parser . parse ( testSQL ) ;
85+ const transformer = new PG14ToPG17Transformer ( ) ;
86+ const transformedAst = transformer . transform ( pg14Ast ) ;
87+
88+ expect ( transformedAst . version ) . toBe ( 170004 ) ;
89+ expect ( transformedAst . stmts ) . toBeDefined ( ) ;
90+ expect ( transformedAst . stmts . length ) . toBe ( 1 ) ;
91+
92+ // Verify the structure is preserved
93+ expect ( transformedAst . stmts [ 0 ] . stmt ) . toBeDefined ( ) ;
94+ const stmt = transformedAst . stmts [ 0 ] . stmt as any ;
95+ expect ( stmt . SelectStmt ) . toBeDefined ( ) ;
96+ } ) ;
97+
98+ it ( 'should transform PG14 Node to PG17' , async ( ) => {
99+ const pg14Parser = new Parser ( { version : 14 } ) ;
100+
101+ const pg14Ast = await pg14Parser . parse ( testSQL ) ;
102+ const transformer = new PG14ToPG17Transformer ( ) ;
103+
104+ // Transform just the statement node
105+ const stmtNode = pg14Ast . stmts [ 0 ] . stmt ;
106+ const transformedNode = transformer . transform ( stmtNode ) ;
107+
108+ // Verify the node was transformed
109+ expect ( transformedNode ) . toBeDefined ( ) ;
110+ expect ( ( transformedNode as any ) . SelectStmt ) . toBeDefined ( ) ;
111+ } ) ;
112+ } ) ;
113+
114+ describe ( 'PG13ToPG17Transformer' , ( ) => {
115+ it ( 'should transform PG13 ParseResult to PG17' , async ( ) => {
116+ const pg13Parser = new Parser ( { version : 13 } ) ;
117+
118+ const pg13Ast = await pg13Parser . parse ( testSQL ) ;
119+ const transformer = new PG13ToPG17Transformer ( ) ;
120+ const transformedAst = transformer . transform ( pg13Ast ) ;
121+
122+ expect ( transformedAst . version ) . toBe ( 170004 ) ;
123+ expect ( transformedAst . stmts ) . toBeDefined ( ) ;
124+ expect ( transformedAst . stmts . length ) . toBe ( 1 ) ;
125+
126+ // Verify the structure is preserved
127+ expect ( transformedAst . stmts [ 0 ] . stmt ) . toBeDefined ( ) ;
128+ const stmt = transformedAst . stmts [ 0 ] . stmt as any ;
129+ expect ( stmt . SelectStmt ) . toBeDefined ( ) ;
130+ } ) ;
131+
132+ it ( 'should transform PG13 Node to PG17' , async ( ) => {
133+ const pg13Parser = new Parser ( { version : 13 } ) ;
134+
135+ const pg13Ast = await pg13Parser . parse ( testSQL ) ;
136+ const transformer = new PG13ToPG17Transformer ( ) ;
137+
138+ // Transform just the statement node
139+ const stmtNode = pg13Ast . stmts [ 0 ] . stmt ;
140+ const transformedNode = transformer . transform ( stmtNode ) ;
141+
142+ // Verify the node was transformed
143+ expect ( transformedNode ) . toBeDefined ( ) ;
144+ expect ( ( transformedNode as any ) . SelectStmt ) . toBeDefined ( ) ;
145+ } ) ;
146+ } ) ;
147+
148+ describe ( 'Complex node transformations' , ( ) => {
149+ it ( 'should transform nested nodes' , async ( ) => {
150+ const complexSQL = `
151+ WITH active_users AS (
152+ SELECT * FROM users WHERE active = true
153+ )
154+ SELECT id, name FROM active_users
155+ ORDER BY name
156+ LIMIT 10
157+ ` ;
158+
159+ const pg15Parser = new Parser ( { version : 15 } ) ;
160+ const pg15Ast = await pg15Parser . parse ( complexSQL ) ;
161+ const transformer = new PG15ToPG17Transformer ( ) ;
162+
163+ // Transform the entire AST
164+ const transformedAst = transformer . transform ( pg15Ast ) ;
165+ expect ( transformedAst . version ) . toBe ( 170004 ) ;
166+
167+ // Transform just a nested node (the WITH clause)
168+ const selectStmt = pg15Ast . stmts [ 0 ] . stmt as any ;
169+ const withClause = selectStmt . SelectStmt . withClause ;
170+ if ( withClause ) {
171+ const transformedWith = transformer . transform ( withClause ) ;
172+ expect ( transformedWith ) . toBeDefined ( ) ;
173+ }
174+ } ) ;
175+ } ) ;
176+
177+ describe ( 'Error handling' , ( ) => {
178+ it ( 'should handle null/undefined gracefully' , ( ) => {
179+ const transformer = new PG16ToPG17Transformer ( ) ;
180+
181+ expect ( ( ) => transformer . transform ( null as any ) ) . not . toThrow ( ) ;
182+ expect ( ( ) => transformer . transform ( undefined as any ) ) . not . toThrow ( ) ;
183+ } ) ;
184+
185+ it ( 'should handle invalid nodes' , ( ) => {
186+ const transformer = new PG16ToPG17Transformer ( ) ;
187+ const invalidNode = { someRandomProp : 'value' } ;
188+
189+ // Should not throw, but return transformed node
190+ const result = transformer . transform ( invalidNode as any ) ;
191+ expect ( result ) . toBeDefined ( ) ;
192+ } ) ;
193+ } ) ;
194+ } ) ;
0 commit comments