Skip to content

Commit 1168dc2

Browse files
test: crowdsource filters and search (#813)
* test: ensure all crowdsource filters work correctly with detailed test cases * Attempted to fix failing filter tests in UserContributionTest * fix: test to filter data * chore: minor changes * chore: minor changes --------- Co-authored-by: Aatman Vaidya <aatmanvaidya@gmail.com>
1 parent acf73b8 commit 1168dc2

File tree

2 files changed

+242
-46
lines changed

2 files changed

+242
-46
lines changed

uli-community/test/support/fixtures/user_contribution_fixtures.ex

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,38 @@ defmodule UliCommunity.UserContributionFixtures do
44
entities via the `UliCommunity.UserContribution` context.
55
"""
66

7+
alias UliCommunity.UserContribution
8+
alias UliCommunity.AccountsFixtures
9+
710
@doc """
811
Generate a crowdsourced_slur.
912
"""
1013
def crowdsourced_slur_fixture(attrs \\ %{}) do
14+
attrs =
15+
case Map.get(attrs, :contributor_user_id) do
16+
nil ->
17+
user = AccountsFixtures.user_fixture()
18+
Map.put(attrs, :contributor_user_id, user.id)
19+
20+
_ ->
21+
attrs
22+
end
23+
24+
valid_attrs = %{
25+
appropriated: false,
26+
appropriation_context: nil,
27+
casual: true,
28+
label: "test-slur",
29+
level_of_severity: :medium,
30+
meaning: "some meaning",
31+
categories: [:other],
32+
source: :plugin
33+
}
34+
1135
{:ok, crowdsourced_slur} =
1236
attrs
13-
|> Enum.into(%{
14-
appropriated: true,
15-
appropriation_context: true,
16-
casual: true,
17-
category: ["option1", "option2"],
18-
label: "some label",
19-
level_of_severity: "some level_of_severity",
20-
meaning: "some meaning"
21-
})
22-
|> UliCommunity.UserContribution.create_crowdsourced_slur()
37+
|> Enum.into(valid_attrs)
38+
|> UserContribution.create_crowdsourced_slur()
2339

2440
crowdsourced_slur
2541
end

uli-community/test/uli_community/user_contribution_test.exs

Lines changed: 216 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,22 @@ defmodule UliCommunity.UserContributionTest do
22
use UliCommunity.DataCase
33

44
alias UliCommunity.UserContribution
5+
alias UliCommunity.UserContribution.CrowdsourcedSlur
6+
import UliCommunity.UserContributionFixtures
7+
import UliCommunity.AccountsFixtures, only: [user_fixture: 0]
58

69
describe "crowdsourced_slurs" do
7-
alias UliCommunity.UserContribution.CrowdsourcedSlur
8-
9-
import UliCommunity.UserContributionFixtures
10-
11-
@invalid_attrs %{label: nil, category: nil, level_of_severity: nil, casual: nil, appropriated: nil, appropriation_context: nil, meaning: nil}
10+
@invalid_attrs %{
11+
label: nil,
12+
categories: nil,
13+
level_of_severity: nil,
14+
casual: nil,
15+
appropriated: nil,
16+
appropriation_context: nil,
17+
meaning: nil,
18+
source: nil,
19+
contributor_user_id: nil
20+
}
1221

1322
test "list_crowdsourced_slurs/0 returns all crowdsourced_slurs" do
1423
crowdsourced_slur = crowdsourced_slur_fixture()
@@ -21,51 +30,222 @@ defmodule UliCommunity.UserContributionTest do
2130
end
2231

2332
test "create_crowdsourced_slur/1 with valid data creates a crowdsourced_slur" do
24-
valid_attrs = %{label: "some label", category: ["option1", "option2"], level_of_severity: "some level_of_severity", casual: true, appropriated: true, appropriation_context: true, meaning: "some meaning"}
25-
26-
assert {:ok, %CrowdsourcedSlur{} = crowdsourced_slur} = UserContribution.create_crowdsourced_slur(valid_attrs)
27-
assert crowdsourced_slur.label == "some label"
28-
assert crowdsourced_slur.category == ["option1", "option2"]
29-
assert crowdsourced_slur.level_of_severity == "some level_of_severity"
30-
assert crowdsourced_slur.casual == true
31-
assert crowdsourced_slur.appropriated == true
32-
assert crowdsourced_slur.appropriation_context == true
33-
assert crowdsourced_slur.meaning == "some meaning"
33+
user = user_fixture()
34+
35+
valid_attrs = %{
36+
label: "some label",
37+
categories: [:gendered],
38+
level_of_severity: :medium,
39+
casual: true,
40+
appropriated: true,
41+
appropriation_context: true,
42+
meaning: "some meaning",
43+
source: :plugin,
44+
contributor_user_id: user.id
45+
}
46+
47+
assert {:ok, %CrowdsourcedSlur{} = slur} =
48+
UserContribution.create_crowdsourced_slur(valid_attrs)
49+
50+
assert slur.label == "some label"
51+
assert slur.categories == [:gendered]
52+
assert slur.level_of_severity == :medium
53+
assert slur.casual
54+
assert slur.appropriated
55+
assert slur.appropriation_context
56+
assert slur.meaning == "some meaning"
3457
end
3558

3659
test "create_crowdsourced_slur/1 with invalid data returns error changeset" do
37-
assert {:error, %Ecto.Changeset{}} = UserContribution.create_crowdsourced_slur(@invalid_attrs)
60+
assert {:error, %Ecto.Changeset{}} =
61+
UserContribution.create_crowdsourced_slur(@invalid_attrs)
3862
end
3963

4064
test "update_crowdsourced_slur/2 with valid data updates the crowdsourced_slur" do
41-
crowdsourced_slur = crowdsourced_slur_fixture()
42-
update_attrs = %{label: "some updated label", category: ["option1"], level_of_severity: "some updated level_of_severity", casual: false, appropriated: false, appropriation_context: false, meaning: "some updated meaning"}
43-
44-
assert {:ok, %CrowdsourcedSlur{} = crowdsourced_slur} = UserContribution.update_crowdsourced_slur(crowdsourced_slur, update_attrs)
45-
assert crowdsourced_slur.label == "some updated label"
46-
assert crowdsourced_slur.category == ["option1"]
47-
assert crowdsourced_slur.level_of_severity == "some updated level_of_severity"
48-
assert crowdsourced_slur.casual == false
49-
assert crowdsourced_slur.appropriated == false
50-
assert crowdsourced_slur.appropriation_context == false
51-
assert crowdsourced_slur.meaning == "some updated meaning"
65+
slur = crowdsourced_slur_fixture()
66+
67+
update_attrs = %{
68+
label: "updated label",
69+
categories: [:caste],
70+
level_of_severity: :high,
71+
casual: false,
72+
appropriated: false,
73+
appropriation_context: false,
74+
meaning: "updated meaning"
75+
}
76+
77+
assert {:ok, %CrowdsourcedSlur{} = updated} =
78+
UserContribution.update_crowdsourced_slur(slur, update_attrs)
79+
80+
assert updated.label == "updated label"
81+
assert updated.categories == [:caste]
82+
assert updated.level_of_severity == :high
83+
refute updated.casual
84+
refute updated.appropriated
85+
refute updated.appropriation_context
5286
end
5387

5488
test "update_crowdsourced_slur/2 with invalid data returns error changeset" do
55-
crowdsourced_slur = crowdsourced_slur_fixture()
56-
assert {:error, %Ecto.Changeset{}} = UserContribution.update_crowdsourced_slur(crowdsourced_slur, @invalid_attrs)
57-
assert crowdsourced_slur == UserContribution.get_crowdsourced_slur!(crowdsourced_slur.id)
89+
slur = crowdsourced_slur_fixture()
90+
91+
assert {:error, %Ecto.Changeset{}} =
92+
UserContribution.update_crowdsourced_slur(slur, @invalid_attrs)
93+
94+
assert slur == UserContribution.get_crowdsourced_slur!(slur.id)
5895
end
5996

6097
test "delete_crowdsourced_slur/1 deletes the crowdsourced_slur" do
61-
crowdsourced_slur = crowdsourced_slur_fixture()
62-
assert {:ok, %CrowdsourcedSlur{}} = UserContribution.delete_crowdsourced_slur(crowdsourced_slur)
63-
assert_raise Ecto.NoResultsError, fn -> UserContribution.get_crowdsourced_slur!(crowdsourced_slur.id) end
98+
slur = crowdsourced_slur_fixture()
99+
assert {:ok, %CrowdsourcedSlur{}} = UserContribution.delete_crowdsourced_slur(slur)
100+
assert_raise Ecto.NoResultsError, fn -> UserContribution.get_crowdsourced_slur!(slur.id) end
64101
end
65102

66-
test "change_crowdsourced_slur/1 returns a crowdsourced_slur changeset" do
67-
crowdsourced_slur = crowdsourced_slur_fixture()
68-
assert %Ecto.Changeset{} = UserContribution.change_crowdsourced_slur(crowdsourced_slur)
103+
test "change_crowdsourced_slur/1 returns a changeset" do
104+
slur = crowdsourced_slur_fixture()
105+
assert %Ecto.Changeset{} = UserContribution.change_crowdsourced_slur(slur)
106+
end
107+
end
108+
109+
describe "filter tests" do
110+
defp create_dummy_slur(attrs \\ %{}) do
111+
defaults = %{
112+
categories: [:caste],
113+
level_of_severity: :medium,
114+
casual: true,
115+
appropriated: false,
116+
appropriation_context: nil,
117+
meaning: "meaning",
118+
source: :plugin
119+
}
120+
121+
UliCommunity.UserContributionFixtures.crowdsourced_slur_fixture(Map.merge(defaults, attrs))
122+
end
123+
124+
setup do
125+
Repo.delete_all(CrowdsourcedSlur)
126+
127+
slurs = [
128+
create_dummy_slur(%{level_of_severity: :high, source: :plugin, categories: [:caste]}),
129+
create_dummy_slur(%{level_of_severity: :high, source: :plugin, categories: [:gendered]}),
130+
create_dummy_slur(%{
131+
level_of_severity: :medium,
132+
casual: false,
133+
appropriated: true,
134+
source: :plugin,
135+
categories: [:religion]
136+
}),
137+
create_dummy_slur(%{
138+
level_of_severity: :medium,
139+
source: :experts_2022,
140+
categories: [:class]
141+
}),
142+
create_dummy_slur(%{
143+
level_of_severity: :low,
144+
casual: false,
145+
appropriated: true,
146+
source: :experts_2022,
147+
categories: [:body_shaming]
148+
}),
149+
create_dummy_slur(%{level_of_severity: :low, source: :experts_2022, categories: [:caste]}),
150+
create_dummy_slur(%{source: :crowdsourcing_exercise, categories: [:gendered]}),
151+
create_dummy_slur(%{
152+
source: :crowdsourcing_exercise,
153+
categories: [:political_affiliation]
154+
}),
155+
create_dummy_slur(%{
156+
casual: true,
157+
appropriated: false,
158+
source: :crowdsourcing_exercise,
159+
categories: [:ethnicity]
160+
}),
161+
create_dummy_slur(%{
162+
casual: false,
163+
appropriated: false,
164+
source: :crowdsourcing_exercise,
165+
categories: [:sexual_identity]
166+
})
167+
]
168+
169+
%{slurs: slurs}
170+
end
171+
172+
test "filters by level_of_severity", %{slurs: slurs} do
173+
expected_ids =
174+
slurs
175+
|> Enum.filter(&(&1.level_of_severity == :high))
176+
|> Enum.map(& &1.id)
177+
|> Enum.sort()
178+
179+
{_count, filtered} =
180+
UserContribution.list_crowdsourced_slurs_with_filters(level_of_severity: "high")
181+
182+
result_ids = Enum.map(filtered, & &1.id) |> Enum.sort()
183+
184+
assert result_ids == expected_ids
185+
end
186+
187+
test "filters by casual + appropriated flags", %{slurs: slurs} do
188+
expected =
189+
slurs
190+
|> Enum.filter(&(&1.casual == true and &1.appropriated == false))
191+
|> Enum.map(& &1.id)
192+
|> Enum.sort()
193+
194+
{_count, filtered} =
195+
UserContribution.list_crowdsourced_slurs_with_filters(
196+
casual: "true",
197+
appropriated: "false"
198+
)
199+
200+
result_ids = Enum.map(filtered, & &1.id) |> Enum.sort()
201+
202+
assert result_ids == expected
203+
end
204+
205+
test "filters by source", %{slurs: slurs} do
206+
expected_ids =
207+
slurs
208+
|> Enum.filter(&(&1.source == :plugin))
209+
|> Enum.map(& &1.id)
210+
|> Enum.sort()
211+
212+
{_count, filtered} =
213+
UserContribution.list_crowdsourced_slurs_with_filters(source: "plugin")
214+
215+
result_ids = Enum.map(filtered, & &1.id) |> Enum.sort()
216+
217+
assert result_ids == expected_ids
218+
end
219+
220+
test "filters by multiple categories", %{slurs: slurs} do
221+
target_categories = [:gendered, :caste]
222+
category_strings = Enum.map(target_categories, &Atom.to_string/1)
223+
224+
{_count, filtered} =
225+
UserContribution.list_crowdsourced_slurs_with_filters(categories: category_strings)
226+
227+
expected_ids =
228+
slurs
229+
|> Enum.filter(fn s -> Enum.any?(s.categories, &(&1 in target_categories)) end)
230+
|> Enum.map(& &1.id)
231+
|> Enum.sort()
232+
233+
result_ids = Enum.map(filtered, & &1.id) |> Enum.sort()
234+
235+
assert result_ids == expected_ids
236+
end
237+
238+
test "filters by search term in label", %{slurs: slurs} do
239+
expected =
240+
slurs
241+
|> Enum.find(&(&1.label == "test-slur"))
242+
243+
{_count, filtered} =
244+
UserContribution.list_crowdsourced_slurs_with_filters(search_term: "test")
245+
246+
result_ids = Enum.map(filtered, & &1.id)
247+
248+
assert expected.id in result_ids
69249
end
70250
end
71251
end

0 commit comments

Comments
 (0)