@@ -104,4 +104,38 @@ describe('bundlerUtils', () => {
104104 expect ( plugin . name ) . toBe ( 'MockCssExtractRspackPlugin' ) ;
105105 } ) ;
106106 } ) ;
107+
108+ describe ( 'Edge cases and error handling' , ( ) => {
109+ it ( 'defaults to webpack when assets_bundler is undefined' , ( ) => {
110+ mockConfig . assets_bundler = undefined ;
111+ jest . doMock ( 'shakapacker' , ( ) => ( { config : mockConfig } ) ) ;
112+ const utils = require ( '../../../config/webpack/bundlerUtils' ) ;
113+
114+ const bundler = utils . getBundler ( ) ;
115+
116+ expect ( bundler ) . toBeDefined ( ) ;
117+ expect ( bundler . ProvidePlugin . name ) . toBe ( 'MockProvidePlugin' ) ;
118+ } ) ;
119+
120+ it ( 'throws error for invalid bundler type' , ( ) => {
121+ mockConfig . assets_bundler = 'invalid-bundler' ;
122+ jest . doMock ( 'shakapacker' , ( ) => ( { config : mockConfig } ) ) ;
123+ const utils = require ( '../../../config/webpack/bundlerUtils' ) ;
124+
125+ expect ( ( ) => utils . getBundler ( ) ) . toThrow ( 'Invalid assets_bundler: "invalid-bundler"' ) ;
126+ expect ( ( ) => utils . getBundler ( ) ) . toThrow ( 'Must be one of: webpack, rspack' ) ;
127+ } ) ;
128+
129+ it ( 'returns cached bundler on subsequent calls' , ( ) => {
130+ mockConfig . assets_bundler = 'webpack' ;
131+ jest . doMock ( 'shakapacker' , ( ) => ( { config : mockConfig } ) ) ;
132+ const utils = require ( '../../../config/webpack/bundlerUtils' ) ;
133+
134+ const bundler1 = utils . getBundler ( ) ;
135+ const bundler2 = utils . getBundler ( ) ;
136+
137+ // Should return same instance (memoized)
138+ expect ( bundler1 ) . toBe ( bundler2 ) ;
139+ } ) ;
140+ } ) ;
107141} ) ;
0 commit comments