@@ -231,3 +231,113 @@ describe("os release parsing", () => {
231231 }
232232 } ) ;
233233} ) ;
234+
235+ describe ( "OS Release Analyzer - Error Cases" , ( ) => {
236+ const releaseAnalyzer = require ( "../../../lib/analyzer/os-release/release-analyzer" ) ;
237+
238+ // Test all parsers for null/empty text handling
239+ describe ( "All parsers null/empty handling" , ( ) => {
240+ const parsers = [
241+ { name : "tryOSRelease" , func : releaseAnalyzer . tryOSRelease } ,
242+ { name : "tryLsbRelease" , func : releaseAnalyzer . tryLsbRelease } ,
243+ { name : "tryDebianVersion" , func : releaseAnalyzer . tryDebianVersion } ,
244+ { name : "tryAlpineRelease" , func : releaseAnalyzer . tryAlpineRelease } ,
245+ { name : "tryRedHatRelease" , func : releaseAnalyzer . tryRedHatRelease } ,
246+ { name : "tryCentosRelease" , func : releaseAnalyzer . tryCentosRelease } ,
247+ { name : "tryOracleRelease" , func : releaseAnalyzer . tryOracleRelease } ,
248+ ] ;
249+
250+ test . each ( parsers ) (
251+ "$name should return null for empty/null text" ,
252+ async ( { func } ) => {
253+ expect ( await func ( "" ) ) . toBeNull ( ) ;
254+ expect ( await func ( null ) ) . toBeNull ( ) ;
255+ } ,
256+ ) ;
257+ } ) ;
258+
259+ describe ( "tryOSRelease" , ( ) => {
260+ it ( "should throw error when ID is missing" , async ( ) => {
261+ const text = "VERSION_ID=20.04\nPRETTY_NAME=Ubuntu" ;
262+ await expect ( releaseAnalyzer . tryOSRelease ( text ) ) . rejects . toThrow (
263+ "Failed to parse /etc/os-release" ,
264+ ) ;
265+ } ) ;
266+ } ) ;
267+
268+ describe ( "tryLsbRelease" , ( ) => {
269+ it ( "should throw error when required fields are missing" , async ( ) => {
270+ // Missing DISTRIB_ID
271+ await expect (
272+ releaseAnalyzer . tryLsbRelease ( "DISTRIB_RELEASE=20.04" ) ,
273+ ) . rejects . toThrow ( "Failed to parse /etc/lsb-release" ) ;
274+
275+ // Missing DISTRIB_RELEASE
276+ await expect (
277+ releaseAnalyzer . tryLsbRelease ( "DISTRIB_ID=Ubuntu" ) ,
278+ ) . rejects . toThrow ( "Failed to parse /etc/lsb-release" ) ;
279+ } ) ;
280+ } ) ;
281+
282+ describe ( "tryDebianVersion and tryAlpineRelease - short text handling" , ( ) => {
283+ const shortTextParsers = [
284+ {
285+ name : "tryDebianVersion" ,
286+ func : releaseAnalyzer . tryDebianVersion ,
287+ file : "/etc/debian_version" ,
288+ } ,
289+ {
290+ name : "tryAlpineRelease" ,
291+ func : releaseAnalyzer . tryAlpineRelease ,
292+ file : "/etc/alpine-release" ,
293+ } ,
294+ ] ;
295+
296+ test . each ( shortTextParsers ) (
297+ "$name should throw error for text shorter than 2 chars after trim" ,
298+ async ( { func, file } ) => {
299+ // Test single character
300+ await expect ( func ( "9" ) ) . rejects . toThrow ( `Failed to parse ${ file } ` ) ;
301+ // Test whitespace only
302+ await expect ( func ( " " ) ) . rejects . toThrow ( `Failed to parse ${ file } ` ) ;
303+ // Test single char with whitespace
304+ await expect ( func ( " a " ) ) . rejects . toThrow ( `Failed to parse ${ file } ` ) ;
305+ } ,
306+ ) ;
307+ } ) ;
308+
309+ describe ( "RedHat-based release parsers" , ( ) => {
310+ const rhParsers = [
311+ {
312+ name : "tryRedHatRelease" ,
313+ func : releaseAnalyzer . tryRedHatRelease ,
314+ file : "/etc/redhat-release" ,
315+ } ,
316+ {
317+ name : "tryCentosRelease" ,
318+ func : releaseAnalyzer . tryCentosRelease ,
319+ file : "/etc/centos-release" ,
320+ } ,
321+ {
322+ name : "tryOracleRelease" ,
323+ func : releaseAnalyzer . tryOracleRelease ,
324+ file : "/etc/oracle-release" ,
325+ } ,
326+ ] ;
327+
328+ test . each ( rhParsers ) (
329+ "$name should throw error for missing ID/version patterns" ,
330+ async ( { func, file } ) => {
331+ // No ID pattern found (whitespace only)
332+ await expect ( func ( " \n " ) ) . rejects . toThrow (
333+ `Failed to parse ${ file } ` ,
334+ ) ;
335+
336+ // ID found but no version number
337+ await expect ( func ( "OS Linux release" ) ) . rejects . toThrow (
338+ `Failed to parse ${ file } ` ,
339+ ) ;
340+ } ,
341+ ) ;
342+ } ) ;
343+ } ) ;
0 commit comments