@@ -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
71251end
0 commit comments