I have a
Product schema which has a
UPI(unique product identifier) eg.
A985748BNG6784C . This is an autogenerated unique product identifier.
I have a function
upi_generate() which calls another external function
gen_nano_id() to generate this random unique id.
If by chance, the id generated by
gen_nano_id() has already been generated, the function
upi_generate() calls itself recursively till the time
gen_nano_id() generates a unique id. Thus generating a unique
gen_nano_id() can sometimes return duplicate ids and for that purpose I have written the below code with recursive call.
def gen_nano_id() do #external function Nanoid.generate(10, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") end # TODO: write test case for this def upi_generate() do # required function upi = "A" <> gen_nano_id() <> "C" case get_product_with_upi(upi) do nil -> upi _ -> upi_generate() end end # Check if product with upi already exists defp get_product_with_upi(upi) do from(p in "snitch_products", select: p.upi, where: p.upi == ^upi) |> Repo.one() end
Now, I have to test the id regeneration logic for duplicate ids.
My testing approach involves following logic. Create two products with duplicate
UPI and try to reach the
_ part of the case comparison.
For this purpose, I have mocked(I don’t control the behaviour of this function) the
Now, the problem that I am facing is mocking results in creation of always the same ids no matter what and I go in an infinite loop.
I am not able to figure out a way to reach the
exit condition(nil) part of case comparison with this mocking approach of