rating 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +111 -5
- data/lib/generators/rating/install_generator.rb +7 -3
- data/lib/generators/rating/templates/db/migrate/create_rating_tables.rb +10 -6
- data/lib/rating/models/rating/extension.rb +32 -13
- data/lib/rating/models/rating/rate.rb +9 -8
- data/lib/rating/models/rating/rating.rb +34 -17
- data/lib/rating/version.rb +1 -1
- data/spec/factories/article.rb +1 -1
- data/spec/factories/author.rb +7 -0
- data/spec/factories/category.rb +7 -0
- data/spec/factories/user.rb +1 -1
- data/spec/models/extension/after_create_spec.rb +16 -7
- data/spec/models/extension/order_by_rating_spec.rb +75 -0
- data/spec/models/extension/rate_for_spec.rb +15 -3
- data/spec/models/extension/rate_spec.rb +15 -3
- data/spec/models/extension/rated_question_spec.rb +24 -6
- data/spec/models/extension/rated_records_spec.rb +26 -0
- data/spec/models/extension/rated_spec.rb +33 -13
- data/spec/models/extension/rates_records_spec.rb +26 -0
- data/spec/models/extension/rates_spec.rb +33 -17
- data/spec/models/extension/rating_records_spec.rb +28 -0
- data/spec/models/extension/rating_spec.rb +31 -15
- data/spec/models/rate/create_spec.rb +104 -37
- data/spec/models/rate/rate_for_spec.rb +26 -6
- data/spec/models/rate_spec.rb +2 -1
- data/spec/models/rating/averager_data_spec.rb +24 -5
- data/spec/models/rating/data_spec.rb +38 -11
- data/spec/models/rating/update_rating_spec.rb +24 -6
- data/spec/models/rating/values_data_spec.rb +31 -8
- data/spec/models/rating_spec.rb +1 -0
- data/spec/support/db/migrate/create_authors_table.rb +9 -0
- data/spec/support/db/migrate/create_category_spec.rb +9 -0
- data/spec/support/migrate.rb +3 -1
- data/spec/support/models/author.rb +5 -0
- data/spec/support/models/category.rb +4 -0
- metadata +22 -20
- data/spec/support/html_matchers.rb +0 -7
data/lib/rating/version.rb
CHANGED
data/spec/factories/article.rb
CHANGED
data/spec/factories/user.rb
CHANGED
@@ -3,17 +3,26 @@
|
|
3
3
|
require 'rails_helper'
|
4
4
|
|
5
5
|
RSpec.describe Rating::Extension, ':after_create' do
|
6
|
-
context '
|
6
|
+
context 'with :as as nil' do
|
7
7
|
let!(:user) { create :user }
|
8
8
|
|
9
|
-
it 'creates a record with zero values just to be easy to make the count' do
|
9
|
+
it 'creates a rating record with zero values just to be easy to make the count' do
|
10
10
|
rating = Rating::Rating.find_by(resource: user)
|
11
11
|
|
12
|
-
expect(rating.average).to
|
13
|
-
expect(rating.estimate).to
|
14
|
-
expect(rating.resource).to
|
15
|
-
expect(rating.
|
16
|
-
expect(rating.
|
12
|
+
expect(rating.average).to eq 0
|
13
|
+
expect(rating.estimate).to eq 0
|
14
|
+
expect(rating.resource).to eq user
|
15
|
+
expect(rating.scopeable).to eq nil
|
16
|
+
expect(rating.sum).to eq 0
|
17
|
+
expect(rating.total).to eq 0
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'with :as as :author' do
|
22
|
+
let!(:author) { create :author }
|
23
|
+
|
24
|
+
it 'does not creates a rating record' do
|
25
|
+
expect(Rating::Rating.exists?(resource: author)).to eq false
|
17
26
|
end
|
18
27
|
end
|
19
28
|
end
|
@@ -3,6 +3,8 @@
|
|
3
3
|
require 'rails_helper'
|
4
4
|
|
5
5
|
RSpec.describe Rating::Extension, ':order_by_rating' do
|
6
|
+
let!(:category) { create :category }
|
7
|
+
|
6
8
|
let!(:user_1) { create :user }
|
7
9
|
let!(:user_2) { create :user }
|
8
10
|
|
@@ -15,6 +17,9 @@ RSpec.describe Rating::Extension, ':order_by_rating' do
|
|
15
17
|
create :rating_rate, author: user_1, resource: article_2, value: 11
|
16
18
|
create :rating_rate, author: user_1, resource: article_3, value: 10
|
17
19
|
create :rating_rate, author: user_2, resource: article_1, value: 1
|
20
|
+
|
21
|
+
create :rating_rate, author: user_1, resource: article_1, scopeable: category, value: 1
|
22
|
+
create :rating_rate, author: user_2, resource: article_1, scopeable: category, value: 2
|
18
23
|
end
|
19
24
|
|
20
25
|
context 'with default filters' do
|
@@ -36,6 +41,14 @@ RSpec.describe Rating::Extension, ':order_by_rating' do
|
|
36
41
|
article_1
|
37
42
|
]
|
38
43
|
end
|
44
|
+
|
45
|
+
context 'with scope' do
|
46
|
+
it 'works' do
|
47
|
+
expect(Article.order_by_rating(:average, :asc, scope: category)).to eq [
|
48
|
+
article_1
|
49
|
+
]
|
50
|
+
end
|
51
|
+
end
|
39
52
|
end
|
40
53
|
|
41
54
|
context 'as desc' do
|
@@ -46,6 +59,14 @@ RSpec.describe Rating::Extension, ':order_by_rating' do
|
|
46
59
|
article_3
|
47
60
|
]
|
48
61
|
end
|
62
|
+
|
63
|
+
context 'with scope' do
|
64
|
+
it 'works' do
|
65
|
+
expect(Article.order_by_rating(:average, :desc, scope: category)).to eq [
|
66
|
+
article_1
|
67
|
+
]
|
68
|
+
end
|
69
|
+
end
|
49
70
|
end
|
50
71
|
end
|
51
72
|
|
@@ -58,6 +79,14 @@ RSpec.describe Rating::Extension, ':order_by_rating' do
|
|
58
79
|
article_1
|
59
80
|
]
|
60
81
|
end
|
82
|
+
|
83
|
+
context 'with scope' do
|
84
|
+
it 'works' do
|
85
|
+
expect(Article.order_by_rating(:estimate, :asc, scope: category)).to eq [
|
86
|
+
article_1
|
87
|
+
]
|
88
|
+
end
|
89
|
+
end
|
61
90
|
end
|
62
91
|
|
63
92
|
context 'as desc' do
|
@@ -68,6 +97,14 @@ RSpec.describe Rating::Extension, ':order_by_rating' do
|
|
68
97
|
article_3
|
69
98
|
]
|
70
99
|
end
|
100
|
+
|
101
|
+
context 'with scope' do
|
102
|
+
it 'works' do
|
103
|
+
expect(Article.order_by_rating(:estimate, :desc, scope: category)).to eq [
|
104
|
+
article_1
|
105
|
+
]
|
106
|
+
end
|
107
|
+
end
|
71
108
|
end
|
72
109
|
end
|
73
110
|
|
@@ -80,6 +117,14 @@ RSpec.describe Rating::Extension, ':order_by_rating' do
|
|
80
117
|
article_1
|
81
118
|
]
|
82
119
|
end
|
120
|
+
|
121
|
+
context 'with scope' do
|
122
|
+
it 'works' do
|
123
|
+
expect(Article.order_by_rating(:sum, :asc, scope: category)).to eq [
|
124
|
+
article_1
|
125
|
+
]
|
126
|
+
end
|
127
|
+
end
|
83
128
|
end
|
84
129
|
|
85
130
|
context 'as desc' do
|
@@ -90,6 +135,14 @@ RSpec.describe Rating::Extension, ':order_by_rating' do
|
|
90
135
|
article_3
|
91
136
|
]
|
92
137
|
end
|
138
|
+
|
139
|
+
context 'with scope' do
|
140
|
+
it 'works' do
|
141
|
+
expect(Article.order_by_rating(:sum, :desc, scope: category)).to eq [
|
142
|
+
article_1
|
143
|
+
]
|
144
|
+
end
|
145
|
+
end
|
93
146
|
end
|
94
147
|
|
95
148
|
context 'filtering by :total' do
|
@@ -100,6 +153,14 @@ RSpec.describe Rating::Extension, ':order_by_rating' do
|
|
100
153
|
expect(result[0..1]).to match_array [article_2, article_3]
|
101
154
|
expect(result.last).to eq article_1
|
102
155
|
end
|
156
|
+
|
157
|
+
context 'with scope' do
|
158
|
+
it 'works' do
|
159
|
+
expect(Article.order_by_rating(:total, :asc, scope: category)).to eq [
|
160
|
+
article_1
|
161
|
+
]
|
162
|
+
end
|
163
|
+
end
|
103
164
|
end
|
104
165
|
|
105
166
|
context 'as desc' do
|
@@ -109,6 +170,14 @@ RSpec.describe Rating::Extension, ':order_by_rating' do
|
|
109
170
|
expect(result.first).to eq article_1
|
110
171
|
expect(result[1..2]).to match_array [article_2, article_3]
|
111
172
|
end
|
173
|
+
|
174
|
+
context 'with scope' do
|
175
|
+
it 'works' do
|
176
|
+
expect(Article.order_by_rating(:total, :desc, scope: category)).to eq [
|
177
|
+
article_1
|
178
|
+
]
|
179
|
+
end
|
180
|
+
end
|
112
181
|
end
|
113
182
|
end
|
114
183
|
end
|
@@ -117,5 +186,11 @@ RSpec.describe Rating::Extension, ':order_by_rating' do
|
|
117
186
|
it 'works' do
|
118
187
|
expect(User.order_by_rating(:total, :desc)).to match_array [user_1, user_2]
|
119
188
|
end
|
189
|
+
|
190
|
+
context 'with scope' do
|
191
|
+
it 'returns empty since creation has no scope' do
|
192
|
+
expect(User.order_by_rating(:total, :desc, scope: category)).to eq []
|
193
|
+
end
|
194
|
+
end
|
120
195
|
end
|
121
196
|
end
|
@@ -6,9 +6,21 @@ RSpec.describe Rating::Extension, ':rate_for' do
|
|
6
6
|
let!(:user) { create :user }
|
7
7
|
let!(:article) { create :article }
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
context 'with no scopeable' do
|
10
|
+
it 'delegates to rate object' do
|
11
|
+
expect(Rating::Rate).to receive(:rate_for).with author: user, resource: article, scopeable: nil
|
11
12
|
|
12
|
-
|
13
|
+
user.rate_for article
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'with scopeable' do
|
18
|
+
let!(:category) { build :category }
|
19
|
+
|
20
|
+
it 'delegates to rate object' do
|
21
|
+
expect(Rating::Rate).to receive(:rate_for).with author: user, resource: article, scopeable: category
|
22
|
+
|
23
|
+
user.rate_for article, scope: category
|
24
|
+
end
|
13
25
|
end
|
14
26
|
end
|
@@ -6,9 +6,21 @@ RSpec.describe Rating::Extension, ':rate' do
|
|
6
6
|
let!(:user) { create :user }
|
7
7
|
let!(:article) { create :article }
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
context 'with no scopeable' do
|
10
|
+
it 'delegates to rate object' do
|
11
|
+
expect(Rating::Rate).to receive(:create).with author: user, resource: article, scopeable: nil, value: 3
|
11
12
|
|
12
|
-
|
13
|
+
user.rate article, 3
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'with scopeable' do
|
18
|
+
let!(:category) { build :category }
|
19
|
+
|
20
|
+
it 'delegates to rate object' do
|
21
|
+
expect(Rating::Rate).to receive(:create).with author: user, resource: article, scopeable: category, value: 3
|
22
|
+
|
23
|
+
user.rate article, 3, scope: category
|
24
|
+
end
|
13
25
|
end
|
14
26
|
end
|
@@ -6,15 +6,33 @@ RSpec.describe Rating::Extension, ':rated?' do
|
|
6
6
|
let!(:user) { create :user }
|
7
7
|
let!(:article) { create :article }
|
8
8
|
|
9
|
-
context '
|
10
|
-
|
9
|
+
context 'with no scopeable' do
|
10
|
+
context 'when has no rate for the given resource' do
|
11
|
+
before { allow(user).to receive(:rate_for).with(article, scope: nil) { nil } }
|
11
12
|
|
12
|
-
|
13
|
+
specify { expect(user.rated?(article)).to eq false }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when has rate for the given resource' do
|
17
|
+
before { allow(user).to receive(:rate_for).with(article, scope: nil) { double } }
|
18
|
+
|
19
|
+
specify { expect(user.rated?(article)).to eq true }
|
20
|
+
end
|
13
21
|
end
|
14
22
|
|
15
|
-
context '
|
16
|
-
|
23
|
+
context 'with scopeable' do
|
24
|
+
let!(:category) { build :category }
|
25
|
+
|
26
|
+
context 'when has no rate for the given resource' do
|
27
|
+
before { allow(user).to receive(:rate_for).with(article, scope: category) { nil } }
|
28
|
+
|
29
|
+
specify { expect(user.rated?(article, scope: category)).to eq false }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when has rate for the given resource' do
|
33
|
+
before { allow(user).to receive(:rate_for).with(article, scope: category) { double } }
|
17
34
|
|
18
|
-
|
35
|
+
specify { expect(user.rated?(article, scope: category)).to eq true }
|
36
|
+
end
|
19
37
|
end
|
20
38
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
RSpec.describe Rating::Extension, '.rated_records' do
|
6
|
+
let!(:category) { create :category }
|
7
|
+
|
8
|
+
let!(:user_1) { create :user }
|
9
|
+
let!(:user_2) { create :user }
|
10
|
+
|
11
|
+
let!(:article_1) { create :article }
|
12
|
+
let!(:article_2) { create :article }
|
13
|
+
let!(:article_3) { create :article }
|
14
|
+
|
15
|
+
let!(:rate_1) { create :rating_rate, author: user_1, resource: article_1, value: 100 }
|
16
|
+
let!(:rate_2) { create :rating_rate, author: user_1, resource: article_2, value: 11 }
|
17
|
+
let!(:rate_3) { create :rating_rate, author: user_1, resource: article_3, value: 10 }
|
18
|
+
let!(:rate_4) { create :rating_rate, author: user_2, resource: article_1, value: 1 }
|
19
|
+
|
20
|
+
let!(:rate_5) { create :rating_rate, author: user_1, resource: article_1, scopeable: category, value: 1 }
|
21
|
+
let!(:rate_6) { create :rating_rate, author: user_2, resource: article_1, scopeable: category, value: 2 }
|
22
|
+
|
23
|
+
it 'returns all rates that this author gave' do
|
24
|
+
expect(user_1.rated_records).to match_array [rate_1, rate_2, rate_3, rate_5]
|
25
|
+
end
|
26
|
+
end
|
@@ -3,36 +3,56 @@
|
|
3
3
|
require 'rails_helper'
|
4
4
|
|
5
5
|
RSpec.describe Rating::Extension, ':rated' do
|
6
|
-
let!(:
|
7
|
-
let!(:article) { create :article }
|
6
|
+
let!(:category) { create :category }
|
8
7
|
|
9
|
-
|
8
|
+
let!(:user_1) { create :user }
|
9
|
+
let!(:user_2) { create :user }
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
let!(:article_1) { create :article }
|
12
|
+
let!(:article_2) { create :article }
|
13
|
+
let!(:article_3) { create :article }
|
14
|
+
|
15
|
+
let!(:rate_1) { create :rating_rate, author: user_1, resource: article_1, value: 100 }
|
16
|
+
let!(:rate_2) { create :rating_rate, author: user_1, resource: article_2, value: 11 }
|
17
|
+
let!(:rate_3) { create :rating_rate, author: user_1, resource: article_3, value: 10 }
|
18
|
+
let!(:rate_4) { create :rating_rate, author: user_2, resource: article_1, value: 1 }
|
19
|
+
|
20
|
+
let!(:rate_5) { create :rating_rate, author: user_1, resource: article_1, scopeable: category, value: 1 }
|
21
|
+
let!(:rate_6) { create :rating_rate, author: user_2, resource: article_1, scopeable: category, value: 2 }
|
22
|
+
|
23
|
+
context 'with no scope' do
|
24
|
+
it 'returns rates made by this author' do
|
25
|
+
expect(user_1.rated).to match_array [rate_1, rate_2, rate_3]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'with no scope' do
|
30
|
+
it 'returns scoped rates made by this author' do
|
31
|
+
expect(user_1.rated(scope: category)).to eq [rate_5]
|
32
|
+
end
|
13
33
|
end
|
14
34
|
|
15
35
|
context 'when destroy author' do
|
16
36
|
before do
|
17
|
-
expect(Rating::Rate.where(author:
|
37
|
+
expect(Rating::Rate.where(author: user_1).count).to eq 4
|
18
38
|
|
19
|
-
|
39
|
+
user_1.destroy!
|
20
40
|
end
|
21
41
|
|
22
|
-
it 'destroys rates of
|
23
|
-
expect(Rating::Rate.where(author:
|
42
|
+
it 'destroys rates of that author' do
|
43
|
+
expect(Rating::Rate.where(author: user_1).count).to eq 0
|
24
44
|
end
|
25
45
|
end
|
26
46
|
|
27
47
|
context 'when destroy resource rated by author' do
|
28
48
|
before do
|
29
|
-
expect(Rating::Rate.where(resource:
|
49
|
+
expect(Rating::Rate.where(resource: article_1).count).to eq 4
|
30
50
|
|
31
|
-
|
51
|
+
article_1.destroy!
|
32
52
|
end
|
33
53
|
|
34
|
-
it 'destroys rates
|
35
|
-
expect(Rating::Rate.where(resource:
|
54
|
+
it 'destroys rates of that resource' do
|
55
|
+
expect(Rating::Rate.where(resource: article_1).count).to eq 0
|
36
56
|
end
|
37
57
|
end
|
38
58
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
RSpec.describe Rating::Extension, '.rates_records' do
|
6
|
+
let!(:category) { create :category }
|
7
|
+
|
8
|
+
let!(:user_1) { create :user }
|
9
|
+
let!(:user_2) { create :user }
|
10
|
+
|
11
|
+
let!(:article_1) { create :article }
|
12
|
+
let!(:article_2) { create :article }
|
13
|
+
let!(:article_3) { create :article }
|
14
|
+
|
15
|
+
let!(:rate_1) { create :rating_rate, author: user_1, resource: article_1, value: 100 }
|
16
|
+
let!(:rate_2) { create :rating_rate, author: user_1, resource: article_2, value: 11 }
|
17
|
+
let!(:rate_3) { create :rating_rate, author: user_1, resource: article_3, value: 10 }
|
18
|
+
let!(:rate_4) { create :rating_rate, author: user_2, resource: article_1, value: 1 }
|
19
|
+
|
20
|
+
let!(:rate_5) { create :rating_rate, author: user_1, resource: article_1, scopeable: category, value: 1 }
|
21
|
+
let!(:rate_6) { create :rating_rate, author: user_2, resource: article_1, scopeable: category, value: 2 }
|
22
|
+
|
23
|
+
it 'returns all rates that this resource received' do
|
24
|
+
expect(article_1.rates_records).to match_array [rate_1, rate_4, rate_5, rate_6]
|
25
|
+
end
|
26
|
+
end
|
@@ -3,36 +3,52 @@
|
|
3
3
|
require 'rails_helper'
|
4
4
|
|
5
5
|
RSpec.describe Rating::Extension, ':rates' do
|
6
|
-
let!(:
|
7
|
-
let!(:article) { create :article }
|
6
|
+
let!(:category) { create :category }
|
8
7
|
|
9
|
-
|
8
|
+
let!(:user_1) { create :user }
|
9
|
+
let!(:user_2) { create :user }
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
let!(:article_1) { create :article }
|
12
|
+
let!(:article_2) { create :article }
|
13
|
+
let!(:article_3) { create :article }
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
let!(:rate_1) { create :rating_rate, author: user_1, resource: article_1, value: 100 }
|
16
|
+
let!(:rate_2) { create :rating_rate, author: user_1, resource: article_2, value: 11 }
|
17
|
+
let!(:rate_3) { create :rating_rate, author: user_1, resource: article_3, value: 10 }
|
18
|
+
let!(:rate_4) { create :rating_rate, author: user_2, resource: article_1, value: 1 }
|
19
|
+
|
20
|
+
let!(:rate_5) { create :rating_rate, author: user_1, resource: article_1, scopeable: category, value: 1 }
|
21
|
+
let!(:rate_6) { create :rating_rate, author: user_2, resource: article_1, scopeable: category, value: 2 }
|
18
22
|
|
19
|
-
|
23
|
+
context 'with no scope' do
|
24
|
+
it 'returns rates that this resource received' do
|
25
|
+
expect(article_1.rates).to match_array [rate_1, rate_4]
|
20
26
|
end
|
27
|
+
end
|
21
28
|
|
22
|
-
|
23
|
-
|
29
|
+
context 'with scope' do
|
30
|
+
it 'returns scoped rates that this resource received' do
|
31
|
+
expect(article_1.rates(scope: category)).to match_array [rate_5, rate_6]
|
24
32
|
end
|
25
33
|
end
|
26
34
|
|
27
|
-
context 'when destroy
|
28
|
-
|
29
|
-
expect(Rating::Rate.where(
|
35
|
+
context 'when destroy author' do
|
36
|
+
it 'destroys rates of that author' do
|
37
|
+
expect(Rating::Rate.where(author: user_1).count).to eq 4
|
38
|
+
|
39
|
+
user_1.destroy!
|
30
40
|
|
31
|
-
|
41
|
+
expect(Rating::Rate.where(author: user_1).count).to eq 0
|
32
42
|
end
|
43
|
+
end
|
33
44
|
|
45
|
+
context 'when destroy resource' do
|
34
46
|
it 'destroys rates of that resource' do
|
35
|
-
expect(Rating::Rate.where(resource:
|
47
|
+
expect(Rating::Rate.where(resource: article_1).count).to eq 4
|
48
|
+
|
49
|
+
article_1.destroy!
|
50
|
+
|
51
|
+
expect(Rating::Rate.where(resource: article_1).count).to eq 0
|
36
52
|
end
|
37
53
|
end
|
38
54
|
end
|