Skip to content

Commit d33176c

Browse files
Jeshan7arjun289
authored andcommitted
[test] review related models and schema (#471)
## Why? * Tests for product_review and review schema and model were not present. ## This change addresses the need by: * Adding tests for product_review and review(schema). * Refactoring the product_review and review(model tests). [delivers #163622129]
1 parent 4b92ae8 commit d33176c

File tree

5 files changed

+228
-48
lines changed

5 files changed

+228
-48
lines changed

apps/snitch_core/test/data/model/product_review_test.exs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,20 @@ defmodule Snitch.Data.Model.ProductReviewTest do
5555
assert result.review_count == 2
5656
end
5757

58+
@tag rating_option_count: 2
59+
describe "fetch_rating_option/1" do
60+
test "return a valid rating_option", context do
61+
%{rating_options: rating_options} = context
62+
[rating_option_1 | rating_option_2] = rating_options
63+
{:ok, returned_rating_option} = ProductReview.fetch_rating_option(rating_option_1.id)
64+
assert returned_rating_option.id == rating_option_1.id
65+
end
66+
67+
test "fails for invalid id" do
68+
assert {:error, :rating_option_not_found} = ProductReview.fetch_rating_option(-1)
69+
end
70+
end
71+
5872
defp product_review_params(product, user, rating_option) do
5973
%{
6074
attributes: %{

apps/snitch_core/test/data/model/review_test.exs

Lines changed: 48 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -5,58 +5,60 @@ defmodule Snitch.Data.Model.ReviewTest do
55
import Snitch.Factory
66
alias Snitch.Data.Model.{Review, ProductReview}
77

8-
setup do
9-
product = insert(:product)
10-
[product: product]
8+
setup :rating_options
9+
setup :review_params
10+
11+
describe "update/2" do
12+
test "updates a review successfully", %{
13+
review: review,
14+
rating_option_vote: rating_option_vote
15+
} do
16+
update_params = %{
17+
description: "new description",
18+
rating_option_vote: rating_option_vote
19+
}
20+
21+
{:ok, updated_review} = Review.update(update_params, review)
22+
assert updated_review.id == review.id
23+
assert updated_review.description != review.description
24+
end
25+
26+
test "fails for invalid params", %{review: review} do
27+
update_params = %{description: ""}
28+
29+
{:error, updated_review} = Review.update(update_params, review)
30+
assert %{description: ["can't be blank"]} == errors_on(updated_review)
31+
end
1132
end
1233

13-
setup :rating_options
34+
describe "delete/1" do
35+
test "successful for valid id", %{review: review} do
36+
assert {:ok, _} = Review.delete(review.id)
37+
assert Review.get(review.id) == {:error, :review_not_found}
38+
end
1439

15-
@tag rating_option_count: 2
16-
test "update a review successfully", context do
17-
%{product: product} = context
18-
user = insert(:user)
19-
%{rating_options: rating_options} = context
20-
[rating_option_1 | [rating_option_2 | _]] = rating_options
21-
review_params = product_review_params(product, user, rating_option_1)
22-
assert {:ok, review} = ProductReview.add(review_params)
23-
24-
update_params = %{
25-
description: "new description",
26-
rating_option_vote: %{rating_option: rating_option_2}
27-
}
28-
29-
assert {:ok, updated_review} = Review.update(update_params, review)
30-
assert updated_review.id == review.id
31-
assert updated_review.description != review.description
40+
test "fails for invalid id" do
41+
{:error, :review_not_found} = Review.get(-1)
42+
end
3243
end
3344

34-
@tag rating_option_count: 1
35-
test "delete a product review", context do
36-
%{product: product} = context
37-
user = insert(:user)
38-
%{rating_options: rating_options} = context
39-
rating_option = List.first(rating_options)
40-
review_params = product_review_params(product, user, rating_option)
41-
assert {:ok, review} = ProductReview.add(review_params)
42-
product_before_delete = Repo.preload(product, :reviews)
43-
assert length(product_before_delete.reviews) != 0
44-
assert {:ok, _} = Review.delete(review.id)
45-
product_after_delete = Repo.preload(product, :reviews)
46-
assert product_after_delete.reviews == []
45+
describe "get/1" do
46+
test "returns a review", %{review: review} do
47+
{:ok, new_review} = Review.get(review.id)
48+
assert new_review.id == review.id
49+
end
50+
51+
test "fails for invalid id" do
52+
{:error, :review_not_found} = Review.get(-1)
53+
end
4754
end
4855

49-
defp product_review_params(product, user, rating_option) do
50-
%{
51-
attributes: %{
52-
description: "awesomeness redefined",
53-
user_id: user.id,
54-
name: "stark"
55-
},
56-
rating_option_vote: %{
57-
rating_option: rating_option
58-
},
59-
product_id: product.id
60-
}
56+
defp review_params(context) do
57+
%{rating_options: rating_options} = context
58+
[rating_option_1, rating_option_2] = rating_options
59+
60+
review = insert(:review, rating_option_vote: %{rating_option: rating_option_1})
61+
rating_option_vote = %{rating_option: rating_option_2}
62+
%{review: review, rating_option_vote: rating_option_vote}
6163
end
6264
end
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
defmodule Snitch.Data.Schema.ProductReviewTest do
2+
use ExUnit.Case
3+
use Snitch.DataCase
4+
5+
import Snitch.Factory
6+
7+
alias Snitch.Data.Schema.ProductReview
8+
9+
setup do
10+
product_review = insert(:product_review)
11+
[product_review: product_review]
12+
end
13+
14+
describe "create_changeset/2" do
15+
test "returns a valid changeset", %{product_review: product_review} do
16+
params = Map.from_struct(product_review)
17+
changeset = ProductReview.create_changeset(%ProductReview{}, params)
18+
assert changeset.valid?
19+
end
20+
21+
test "fails for invalid params" do
22+
changeset = ProductReview.create_changeset(%ProductReview{}, %{})
23+
24+
assert %{product_id: ["can't be blank"], review_id: ["can't be blank"]} ==
25+
errors_on(changeset)
26+
end
27+
28+
test "fails for non-existent product_id and review_id", %{product_review: product_review} do
29+
product_review_1 = %{product_review | product_id: -1}
30+
params = Map.from_struct(product_review_1)
31+
cs = ProductReview.create_changeset(%ProductReview{}, params)
32+
{:error, changeset} = Repo.insert(cs)
33+
assert %{product_id: ["does not exist"]} == errors_on(changeset)
34+
35+
product_review = %{product_review | product_id: product_review.product_id, review_id: -1}
36+
params = Map.from_struct(product_review)
37+
cs = ProductReview.create_changeset(%ProductReview{}, params)
38+
{:error, changeset} = Repo.insert(cs)
39+
assert %{review_id: ["does not exist"]} == errors_on(changeset)
40+
end
41+
end
42+
43+
describe "update_changeset/2" do
44+
test "returns a valid changeset", %{product_review: product_review} do
45+
params = %{review_id: 20}
46+
cs = ProductReview.update_changeset(product_review, params)
47+
assert cs.valid?
48+
end
49+
50+
test "fails for invalid params", %{product_review: product_review} do
51+
params = %{review_id: nil, product_id: nil}
52+
changeset = ProductReview.update_changeset(product_review, params)
53+
54+
assert %{product_id: ["can't be blank"], review_id: ["can't be blank"]} ==
55+
errors_on(changeset)
56+
end
57+
58+
test "fails for non existent review_id and product_id", %{product_review: product_review} do
59+
params = %{product_id: -1}
60+
cs = ProductReview.update_changeset(product_review, params)
61+
{:error, changeset} = Repo.update(cs)
62+
assert %{product_id: ["does not exist"]} == errors_on(changeset)
63+
64+
params = %{review_id: -1}
65+
cs = ProductReview.update_changeset(product_review, params)
66+
{:error, changeset} = Repo.update(cs)
67+
assert %{review_id: ["does not exist"]} == errors_on(changeset)
68+
end
69+
end
70+
end
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
defmodule Snitch.Data.Schema.ReviewTest do
2+
use ExUnit.Case, async: true
3+
use Snitch.DataCase
4+
5+
import Snitch.Factory
6+
7+
alias Snitch.Data.Schema.Review
8+
9+
setup :review_params
10+
11+
describe "create_changeset/2" do
12+
test "returns a valid changeset", %{params: params} do
13+
changeset = Review.create_changeset(%Review{}, params)
14+
assert changeset.valid?
15+
end
16+
17+
test "returns invalid changeset" do
18+
changeset = Review.create_changeset(%Review{}, %{})
19+
20+
assert %{
21+
rating_option_vote: ["can't be blank"],
22+
description: ["can't be blank"],
23+
user_id: ["can't be blank"],
24+
name: ["can't be blank"]
25+
} == errors_on(changeset)
26+
end
27+
28+
test "fails for non-existent user_id", %{params: params} do
29+
params = %{params | user_id: -1}
30+
cs = Review.create_changeset(%Review{}, params)
31+
{:error, changeset} = Repo.insert(cs)
32+
assert %{user_id: ["does not exist"]} == errors_on(changeset)
33+
end
34+
end
35+
36+
describe "update_changeset/2" do
37+
test "returns a valid changeset", %{review: review} do
38+
params = %{description: "hakuna matata"}
39+
cs = Review.update_changeset(review, params)
40+
assert cs.valid?
41+
end
42+
43+
test "fails for invalid params", %{review: review} do
44+
params = %{description: ""}
45+
cs = Review.update_changeset(review, params)
46+
assert %{description: ["can't be blank"]} == errors_on(cs)
47+
end
48+
end
49+
50+
defp review_params(context) do
51+
review = insert(:review)
52+
rating_option_vote = review.rating_option_vote
53+
rating_option_vote = Map.from_struct(rating_option_vote)
54+
55+
params = %{
56+
description: "awesomeness redefined",
57+
name: "stark",
58+
user_id: review.user_id,
59+
rating_option_vote: rating_option_vote
60+
}
61+
62+
[params: params, review: review]
63+
end
64+
end

apps/snitch_core/test/support/factory/rating.ex

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ defmodule Snitch.Factory.Rating do
33

44
defmacro __using__(_opts) do
55
quote do
6-
alias Snitch.Data.Schema.{Rating, RatingOption}
6+
alias Snitch.Data.Schema.{Rating, RatingOption, Review, ProductReview}
77

88
def rating_factory do
99
%Rating{
@@ -21,10 +21,40 @@ defmodule Snitch.Factory.Rating do
2121
}
2222
end
2323

24+
def review_factory do
25+
user = insert(:user)
26+
27+
%Review{
28+
description: "awesomeness redefined",
29+
user_id: user.id,
30+
name: "stark",
31+
rating_option_vote: %{
32+
rating_option: build(:rating_option)
33+
}
34+
}
35+
end
36+
37+
def product_review_factory do
38+
%ProductReview{
39+
review: build(:review),
40+
product: build(:product)
41+
}
42+
end
43+
2444
def rating_options(context) do
2545
rating = insert(:rating)
2646
count = Map.get(context, :rating_option_count, 2)
27-
[rating_options: insert_list(3, :rating_option, rating: rating)]
47+
[rating_options: insert_list(count, :rating_option, rating: rating)]
48+
end
49+
50+
def reviews(context) do
51+
rating_option = insert(:rating_option)
52+
count = Map.get(context, :review_count, 1)
53+
54+
[
55+
reviews:
56+
insert_list(count, :review, rating_option_vote: %{rating_option: rating_option})
57+
]
2858
end
2959
end
3060
end

0 commit comments

Comments
 (0)