mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-10-31 10:13:32 -04:00 
			
		
		
		
	
		
			
	
	
		
			112 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | import { describe, expect, test } from "vitest"; | ||
|  | import { useExtractRecipeYield } from "./use-extract-recipe-yield"; | ||
|  | 
 | ||
|  | describe("test use extract recipe yield", () => { | ||
|  |     test("when text empty return empty", () => { | ||
|  |         const result = useExtractRecipeYield(null, 1); | ||
|  |         expect(result).toStrictEqual(""); | ||
|  |     }); | ||
|  | 
 | ||
|  |     test("when text matches nothing return text", () => { | ||
|  |         const val = "this won't match anything"; | ||
|  |         const result = useExtractRecipeYield(val, 1); | ||
|  |         expect(result).toStrictEqual(val); | ||
|  | 
 | ||
|  |         const resultScaled = useExtractRecipeYield(val, 5); | ||
|  |         expect(resultScaled).toStrictEqual(val); | ||
|  |     }); | ||
|  | 
 | ||
|  |     test("when text matches a mixed fraction, return a scaled fraction", () => { | ||
|  |         const val = "10 1/2 units"; | ||
|  |         const result = useExtractRecipeYield(val, 1); | ||
|  |         expect(result).toStrictEqual(val); | ||
|  | 
 | ||
|  |         const resultScaled = useExtractRecipeYield(val, 3); | ||
|  |         expect(resultScaled).toStrictEqual("31 1/2 units"); | ||
|  | 
 | ||
|  |         const resultScaledPartial = useExtractRecipeYield(val, 2.5); | ||
|  |         expect(resultScaledPartial).toStrictEqual("26 1/4 units"); | ||
|  | 
 | ||
|  |         const resultScaledInt = useExtractRecipeYield(val, 4); | ||
|  |         expect(resultScaledInt).toStrictEqual("42 units"); | ||
|  |     }); | ||
|  | 
 | ||
|  |     test("when text matches a fraction, return a scaled fraction", () => { | ||
|  |         const val = "1/3 plates"; | ||
|  |         const result = useExtractRecipeYield(val, 1); | ||
|  |         expect(result).toStrictEqual(val); | ||
|  | 
 | ||
|  |         const resultScaled = useExtractRecipeYield(val, 2); | ||
|  |         expect(resultScaled).toStrictEqual("2/3 plates"); | ||
|  | 
 | ||
|  |         const resultScaledInt = useExtractRecipeYield(val, 3); | ||
|  |         expect(resultScaledInt).toStrictEqual("1 plates"); | ||
|  | 
 | ||
|  |         const resultScaledPartial = useExtractRecipeYield(val, 2.5); | ||
|  |         expect(resultScaledPartial).toStrictEqual("5/6 plates"); | ||
|  | 
 | ||
|  |         const resultScaledMixed = useExtractRecipeYield(val, 4); | ||
|  |         expect(resultScaledMixed).toStrictEqual("1 1/3 plates"); | ||
|  |     }); | ||
|  | 
 | ||
|  |     test("when text matches a decimal, return a scaled, rounded decimal", () => { | ||
|  |         const val = "1.25 parts"; | ||
|  |         const result = useExtractRecipeYield(val, 1); | ||
|  |         expect(result).toStrictEqual(val); | ||
|  | 
 | ||
|  |         const resultScaled = useExtractRecipeYield(val, 2); | ||
|  |         expect(resultScaled).toStrictEqual("2.5 parts"); | ||
|  | 
 | ||
|  |         const resultScaledInt = useExtractRecipeYield(val, 4); | ||
|  |         expect(resultScaledInt).toStrictEqual("5 parts"); | ||
|  | 
 | ||
|  |         const resultScaledPartial = useExtractRecipeYield(val, 2.5); | ||
|  |         expect(resultScaledPartial).toStrictEqual("3.125 parts"); | ||
|  | 
 | ||
|  |         const roundedVal = "1.33333333333333333333 parts"; | ||
|  |         const resultScaledRounded = useExtractRecipeYield(roundedVal, 2); | ||
|  |         expect(resultScaledRounded).toStrictEqual("2.667 parts"); | ||
|  |     }); | ||
|  | 
 | ||
|  |     test("when text matches an int, return a scaled int", () => { | ||
|  |         const val = "5 bowls"; | ||
|  |         const result = useExtractRecipeYield(val, 1); | ||
|  |         expect(result).toStrictEqual(val); | ||
|  | 
 | ||
|  |         const resultScaled = useExtractRecipeYield(val, 2); | ||
|  |         expect(resultScaled).toStrictEqual("10 bowls"); | ||
|  | 
 | ||
|  |         const resultScaledPartial = useExtractRecipeYield(val, 2.5); | ||
|  |         expect(resultScaledPartial).toStrictEqual("12.5 bowls"); | ||
|  | 
 | ||
|  |         const resultScaledLarge = useExtractRecipeYield(val, 10); | ||
|  |         expect(resultScaledLarge).toStrictEqual("50 bowls"); | ||
|  |     }); | ||
|  | 
 | ||
|  |     test("when text contains an invalid fraction, return the original string", () => { | ||
|  |         const valDivZero = "3/0 servings"; | ||
|  |         const resultDivZero = useExtractRecipeYield(valDivZero, 3); | ||
|  |         expect(resultDivZero).toStrictEqual(valDivZero); | ||
|  | 
 | ||
|  |         const valDivZeroMixed = "2 4/0 servings"; | ||
|  |         const resultDivZeroMixed = useExtractRecipeYield(valDivZeroMixed, 6); | ||
|  |         expect(resultDivZeroMixed).toStrictEqual(valDivZeroMixed); | ||
|  |     }); | ||
|  | 
 | ||
|  |     test("when text contains a weird or small fraction, return the original string", () => { | ||
|  |         const valWeird = "2323231239087/134527431962272135 servings"; | ||
|  |         const resultWeird = useExtractRecipeYield(valWeird, 5); | ||
|  |         expect(resultWeird).toStrictEqual(valWeird); | ||
|  | 
 | ||
|  |         const valSmall = "1/20230225 lovable servings"; | ||
|  |         const resultSmall = useExtractRecipeYield(valSmall, 12); | ||
|  |         expect(resultSmall).toStrictEqual(valSmall); | ||
|  |     }); | ||
|  | 
 | ||
|  |     test("when text contains multiple numbers, the first is parsed as the servings amount", () => { | ||
|  |         const val = "100 sets of 55 bowls"; | ||
|  |         const result = useExtractRecipeYield(val, 3); | ||
|  |         expect(result).toStrictEqual("300 sets of 55 bowls"); | ||
|  |     }) | ||
|  | }); |