| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  | import { describe, test, expect } from "vitest"; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | import { ref } from "vue"; | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  | import { useRecipePermissions } from "./use-recipe-permissions"; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | import type { HouseholdSummary } from "~/lib/api/types/household"; | 
					
						
							|  |  |  | import type { Recipe } from "~/lib/api/types/recipe"; | 
					
						
							|  |  |  | import type { UserOut } from "~/lib/api/types/user"; | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | describe("test use recipe permissions", () => { | 
					
						
							|  |  |  |   const commonUserId = "my-user-id"; | 
					
						
							|  |  |  |   const commonGroupId = "my-group-id"; | 
					
						
							|  |  |  |   const commonHouseholdId = "my-household-id"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const createRecipe = (overrides: Partial<Recipe>, isLocked = false): Recipe => ({ | 
					
						
							|  |  |  |     id: "my-recipe-id", | 
					
						
							|  |  |  |     userId: commonUserId, | 
					
						
							|  |  |  |     groupId: commonGroupId, | 
					
						
							|  |  |  |     householdId: commonHouseholdId, | 
					
						
							|  |  |  |     settings: { | 
					
						
							|  |  |  |       locked: isLocked, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     ...overrides, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const createUser = (overrides: Partial<UserOut>): UserOut => ({ | 
					
						
							|  |  |  |     id: commonUserId, | 
					
						
							|  |  |  |     groupId: commonGroupId, | 
					
						
							|  |  |  |     groupSlug: "my-group", | 
					
						
							|  |  |  |     group: "my-group", | 
					
						
							|  |  |  |     householdId: commonHouseholdId, | 
					
						
							|  |  |  |     householdSlug: "my-household", | 
					
						
							|  |  |  |     household: "my-household", | 
					
						
							|  |  |  |     email: "bender.rodriguez@example.com", | 
					
						
							|  |  |  |     cacheKey: "1234", | 
					
						
							|  |  |  |     ...overrides, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |   const createRecipeHousehold = (overrides: Partial<HouseholdSummary>, lockRecipeEdits = false): Ref<HouseholdSummary> => ( | 
					
						
							|  |  |  |     ref({ | 
					
						
							|  |  |  |       id: commonHouseholdId, | 
					
						
							|  |  |  |       groupId: commonGroupId, | 
					
						
							|  |  |  |       name: "My Household", | 
					
						
							|  |  |  |       slug: "my-household", | 
					
						
							|  |  |  |       preferences: { | 
					
						
							|  |  |  |         id: "my-household-preferences-id", | 
					
						
							|  |  |  |         lockRecipeEditsFromOtherHouseholds: lockRecipeEdits, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       ...overrides, | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |   test("when user is null, cannot edit", () => { | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |     const result = useRecipePermissions(createRecipe({}), createRecipeHousehold({}), null); | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |     expect(result.canEditRecipe.value).toBe(false); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   test("when user is recipe owner, can edit", () => { | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |     const result = useRecipePermissions(createRecipe({}), ref(), createUser({})); | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |     expect(result.canEditRecipe.value).toBe(true); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |   test( | 
					
						
							|  |  |  |     "when user is not recipe owner, is correct group and household, recipe is unlocked, and household is unlocked, can edit", | 
					
						
							|  |  |  |     () => { | 
					
						
							|  |  |  |       const result = useRecipePermissions( | 
					
						
							|  |  |  |         createRecipe({}), | 
					
						
							|  |  |  |         createRecipeHousehold({}), | 
					
						
							|  |  |  |         createUser({ id: "other-user-id" }), | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       expect(result.canEditRecipe.value).toBe(true); | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |   ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   test( | 
					
						
							|  |  |  |     "when user is not recipe owner, is correct group and household, recipe is unlocked, but household is locked, can edit", | 
					
						
							|  |  |  |     () => { | 
					
						
							|  |  |  |       const result = useRecipePermissions( | 
					
						
							|  |  |  |         createRecipe({}), | 
					
						
							|  |  |  |         createRecipeHousehold({}, true), | 
					
						
							|  |  |  |         createUser({ id: "other-user-id" }), | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       expect(result.canEditRecipe.value).toBe(true); | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |   ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   test("when user is not recipe owner, and user is other group, cannot edit", () => { | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |     const result = useRecipePermissions( | 
					
						
							|  |  |  |       createRecipe({}), | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |       createRecipeHousehold({}), | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       createUser({ id: "other-user-id", groupId: "other-group-id" }), | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |     ); | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |     expect(result.canEditRecipe.value).toBe(false); | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |   test("when user is not recipe owner, and user is other household, and household is unlocked, can edit", () => { | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |     const result = useRecipePermissions( | 
					
						
							|  |  |  |       createRecipe({}), | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |       createRecipeHousehold({}), | 
					
						
							|  |  |  |       createUser({ id: "other-user-id", householdId: "other-household-id" }), | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |     ); | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |     expect(result.canEditRecipe.value).toBe(true); | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |   test("when user is not recipe owner, and user is other household, and household is locked, cannot edit", () => { | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |     const result = useRecipePermissions( | 
					
						
							|  |  |  |       createRecipe({}), | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |       createRecipeHousehold({}, true), | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |       createUser({ id: "other-user-id", householdId: "other-household-id" }), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     expect(result.canEditRecipe.value).toBe(false); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   test("when user is not recipe owner, and recipe is locked, cannot edit", () => { | 
					
						
							|  |  |  |     const result = useRecipePermissions( | 
					
						
							|  |  |  |       createRecipe({}, true), | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |       createRecipeHousehold({}), | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       createUser({ id: "other-user-id" }), | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |     ); | 
					
						
							|  |  |  |     expect(result.canEditRecipe.value).toBe(false); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-17 10:48:14 -05:00
										 |  |  |   test("when user is recipe owner, and recipe is locked, and household is locked, can edit", () => { | 
					
						
							|  |  |  |     const result = useRecipePermissions(createRecipe({}, true), createRecipeHousehold({}, true), createUser({})); | 
					
						
							| 
									
										
										
										
											2024-08-31 21:54:10 -05:00
										 |  |  |     expect(result.canEditRecipe.value).toBe(true); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |