It’s hard to know for sure without more code, but I’ll take some guesses.
Sales.get_order is a context function - it likely uses your Repo under the hood.
That function can’t take zero args - which order is it getting? For what user? You’ll likely want to pass in the user.
The setup functions in your test file should be setting up things like the current user and orders then passing them into the tests like:
test "get_order/1", %{current_user: current_user} do
assert %Order{status: "Confirmed"} = Sales.get_order(current_user)
end
I’m also not sure if get_order is the right name; chapter 8 talks about viewing the user’s order history, so the logical thing to return is a list of orders - something like Sales.get_orders(user)
I don’t understand what the intent of this code is, or how exactly it would fail. You’ll get more effective help if you show complete code examples (instead of fragments) and specific error messages (instead of “didn’t work”).
Thanks @al2o3cr for the reply. even though it is hard to understand what i wrote, the author uses the following test pattern.
defmodule Mango.SalesTest do
use Mango.DataCase
alias Mango.Sales
alias Mango.Sales.Order
alias Mango.Catalog.Product
test "create_cart" do
assert %Order{status: "In Cart"} = Sales.create_cart
end
test "get_cart/1" do
cart1 = Sales.create_cart
cart2 = Sales.get_cart(cart1.id)
assert cart1.id == cart2.id
end
test "add_to_cart/2" do
product = %Product{
name: "Tomato",
pack_size: "1 kg",
price: 55,
sku: "A123",
is_seasonal: false, category: "vegetables" } |> Repo.insert!
cart = Sales.create_cart
{:ok, cart} = Sales.add_to_cart(cart, %{"product_id" => product.id, "quantity" => "2"})
assert [line_item] = cart.line_items
assert line_item.product_id == product.id
assert line_item.product_name == "Tomato"
assert line_item.pack_size == "1 kg"
assert line_item.quantity == 2
assert line_item.unit_price == Decimal.new(product.price)
assert line_item.total == Decimal.mult(Decimal.new(product.price), Decimal.new(2))
end
end
Also my intent wasn’t to provide just pieces of code. I just found the authors github with the full code and trying to grasp how this test satisfies his requirements for the exercise in the book:
.Exercise requirements:
My Orders
User Story #12
As a customer, I want to see my order history.
As explained earlier, this user story is an exercise for you to workout by yourself by applying the concepts learned so far. Specifications for this user story are given below:
Specifications
There should be a link "My Orders" on the nav bar under the user menu.
Clicking on this "My Orders" link should take users to the /orders page which
lists all orders for the currently logged in customer in an HTML table.
The table should list the following details of each order:
Order ID
Status
Products Ordered
Total
Each order should have a "View" link that takes users to /orders/:id
to view the complete details of the order.
If customers try to view an order that doesn’t belong to them, then a
404 page should be returned.
This exercise is created using TDD so I was following the book’s way of building this. First write the test then the acceptance test and then write the functionality to make it pass.
Looking at the commit history for that repo, I don’t see any code for this particular exercise - the “My Orders” link doesn’t appear, for instance. There also aren’t any tests for controller actions that need an authenticated user, or for context functions that expect a customer…
My reading of the style suggested in that tutorial suggests you’ll want to add a bunch of things:
code in the CRM context to find all orders given a customer, and a particular order given an ID and a customer
tests for the new CRM functions. If there were tests for CRM.get_customer_ticket!, I’d recommend that you follow those - but the generated tests were deleted without replacement.
a controller that handles showing an index of the user’s orders and individual ones, based on conn.assigns.current_customer. It will look a lot like TicketController.
an acceptance test that interacts with those controller actions. Again, there aren’t any examples in that repo of this kind of test. You’ll need to dig into the Hound docs to figure out how to set up the session correctly with customer_id, or simulate going through the login flow by hand.