Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
cs_comments_service
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
cs_comments_service
Commits
bd47a000
Commit
bd47a000
authored
Jan 15, 2016
by
Clinton Blackburn
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #179 from edx/clintonb/spec-cleanup
Updated specs
parents
d5a1919e
0ec1250d
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
265 additions
and
216 deletions
+265
-216
spec/api/comment_thread_spec.rb
+105
-83
spec/api/commentable_spec.rb
+160
-133
No files found.
spec/api/comment_thread_spec.rb
View file @
bd47a000
...
@@ -103,7 +103,7 @@ describe "app" do
...
@@ -103,7 +103,7 @@ describe "app" do
@threads
[
"t1"
].
group_id
=
123
@threads
[
"t1"
].
group_id
=
123
@threads
[
"t1"
].
save!
@threads
[
"t1"
].
save!
rs
=
thread_result
course_id:
DFLT_COURSE_ID
,
group_id:
321
rs
=
thread_result
course_id:
DFLT_COURSE_ID
,
group_id:
321
rs
.
each
.
map
{
|
res
|
res
[
"group_id"
].
should
be_nil
}
rs
.
each
.
map
{
|
res
|
res
[
"group_id"
].
should
be_nil
}
end
end
context
"when filtering flagged posts"
do
context
"when filtering flagged posts"
do
it
"returns threads that are flagged"
do
it
"returns threads that are flagged"
do
...
@@ -231,19 +231,19 @@ describe "app" do
...
@@ -231,19 +231,19 @@ describe "app" do
def
thread_result_order
(
sort_key
,
sort_order
)
def
thread_result_order
(
sort_key
,
sort_order
)
results
=
thread_result
course_id:
DFLT_COURSE_ID
,
sort_key:
sort_key
,
sort_order:
sort_order
results
=
thread_result
course_id:
DFLT_COURSE_ID
,
sort_key:
sort_key
,
sort_order:
sort_order
results
.
length
.
should
==
10
results
.
length
.
should
==
10
results
.
map
{
|
t
|
t
[
"title"
]
}
results
.
map
{
|
t
|
t
[
"title"
]
}
end
end
def
move_to_end
(
ary
,
*
vals
)
def
move_to_end
(
ary
,
*
vals
)
vals
.
each
do
|
val
|
vals
.
each
do
|
val
|
ary
=
ary
.
select
{
|
v
|
v!
=
val
}
<<
val
ary
=
ary
.
select
{
|
v
|
v!
=
val
}
<<
val
end
end
ary
ary
end
end
def
move_to_front
(
ary
,
*
vals
)
def
move_to_front
(
ary
,
*
vals
)
vals
.
reverse
.
each
do
|
val
|
vals
.
reverse
.
each
do
|
val
|
ary
=
ary
.
select
{
|
v
|
v!
=
val
}.
insert
(
0
,
val
)
ary
=
ary
.
select
{
|
v
|
v!
=
val
}.
insert
(
0
,
val
)
end
end
ary
ary
end
end
...
@@ -383,7 +383,7 @@ describe "app" do
...
@@ -383,7 +383,7 @@ describe "app" do
result
[
"num_pages"
].
should
==
num_pages
result
[
"num_pages"
].
should
==
num_pages
end
end
result
[
"page"
].
should
==
page
result
[
"page"
].
should
==
page
actual_order
+=
result
[
"collection"
].
map
{
|
v
|
v
[
"title"
]
}
actual_order
+=
result
[
"collection"
].
map
{
|
v
|
v
[
"title"
]
}
end
end
actual_order
.
should
==
expected_order
actual_order
.
should
==
expected_order
end
end
...
@@ -393,7 +393,7 @@ describe "app" do
...
@@ -393,7 +393,7 @@ describe "app" do
@threads
[
"t7"
].
pinned
=
true
@threads
[
"t7"
].
pinned
=
true
@threads
[
"t7"
].
save!
@threads
[
"t7"
].
save!
expected_order
=
move_to_front
(
move_to_end
(
@default_order
,
"t5"
),
"t7"
)
expected_order
=
move_to_front
(
move_to_end
(
@default_order
,
"t5"
),
"t7"
)
test_paged_order
({
'sort_key'
=>
'comments'
,
'sort_dir'
=>
'asc'
,
'per_page'
=>
3
},
expected_order
)
test_paged_order
({
'sort_key'
=>
'comments'
,
'sort_dir'
=>
'asc'
,
'per_page'
=>
3
},
expected_order
)
end
end
it
"orders correctly acrosss pages with unread filter"
do
it
"orders correctly acrosss pages with unread filter"
do
...
@@ -405,7 +405,7 @@ describe "app" do
...
@@ -405,7 +405,7 @@ describe "app" do
@threads
[
"t7"
].
save!
@threads
[
"t7"
].
save!
expected_order
=
move_to_front
(
move_to_end
(
@default_order
[
1
..
8
],
"t5"
),
"t7"
)
expected_order
=
move_to_front
(
move_to_end
(
@default_order
[
1
..
8
],
"t5"
),
"t7"
)
test_paged_order
(
test_paged_order
(
{
'sort_key'
=>
'comments'
,
'sort_dir'
=>
'asc'
,
'per_page'
=>
3
},
{
'sort_key'
=>
'comments'
,
'sort_dir'
=>
'asc'
,
'per_page'
=>
3
},
expected_order
,
expected_order
,
[
"unread"
],
[
"unread"
],
user
.
id
user
.
id
...
@@ -417,9 +417,9 @@ describe "app" do
...
@@ -417,9 +417,9 @@ describe "app" do
end
end
def
test_unicode_data
(
text
)
def
test_unicode_data
(
text
)
course_id
=
"unicode_course"
course_id
=
'unicode_course'
thread
=
make_thread
(
User
.
first
,
text
,
course_id
,
"unicode_commentable"
)
thread
=
create
(
:comment_thread
,
body:
text
,
course_id:
course_id
)
make_comment
(
User
.
first
,
thread
,
text
)
create
(
:comment
,
comment_thread:
thread
,
body:
text
)
result
=
thread_result
(
course_id:
course_id
).
first
result
=
thread_result
(
course_id:
course_id
).
first
check_thread_result_json
(
nil
,
thread
,
result
)
check_thread_result_json
(
nil
,
thread
,
result
)
end
end
...
@@ -427,39 +427,45 @@ describe "app" do
...
@@ -427,39 +427,45 @@ describe "app" do
include_examples
"unicode data"
include_examples
"unicode data"
end
end
describe
"GET /api/v1/threads/:thread_id"
do
describe
'GET /api/v1/threads/:thread_id'
do
let
(
:thread
)
do
before
(
:each
)
{
init_without_subscriptions
}
comment
=
create
(
:comment
)
comment
.
comment_thread
end
it
"returns JSON"
do
subject
do
thread
=
CommentThread
.
first
get
"/api/v1/threads/
#{
thread
.
id
}
"
get
"/api/v1/threads/
#{
thread
.
id
}
"
last_response
.
should
be_ok
last_response
.
content_type
.
should
==
"application/json;charset=utf-8"
end
end
it
"get information of a single comment thread"
do
it
{
should
be_ok
}
thread
=
CommentThread
.
first
get
"/api/v1/threads/
#{
thread
.
id
}
"
it
'returns JSON'
do
last_response
.
should
be_ok
expect
(
subject
.
content_type
).
to
eq
'application/json;charset=utf-8'
response_thread
=
parse
last_response
.
body
check_thread_result_json
(
nil
,
thread
,
response_thread
)
end
end
it
"computes endorsed correctly"
do
it
'get information of a single comment thread'
do
thread
=
CommentThread
.
first
check_thread_result_json
(
nil
,
thread
,
parse
(
subject
.
body
))
comment
=
thread
.
root_comments
[
1
]
end
it
'computes endorsed correctly'
do
comment
=
thread
.
root_comments
[
0
]
comment
.
endorsed
=
true
comment
.
endorsed
=
true
comment
.
save!
comment
.
save!
get
"/api/v1/threads/
#{
thread
.
id
}
"
last_response
.
should
be_ok
expect
(
subject
).
to
be_ok
response_thread
=
parse
last_response
.
body
parsed
=
parse
(
subject
.
body
)
response_thread
[
"endorsed"
].
should
==
true
expect
(
parsed
).
to
include
(
'endorsed'
=>
true
)
# re-request the thread from the database before checking it.
thread
.
reload
thread
=
CommentThread
.
find
(
thread
.
id
)
check_thread_result_json
(
nil
,
thread
,
parsed
)
check_thread_result_json
(
nil
,
thread
,
response_thread
)
end
context
'when marking as read'
do
subject
do
get
"/api/v1/threads/
#{
thread
.
id
}
"
,
{
:user_id
=>
thread
.
author
.
id
,
:mark_as_read
=>
true
}
end
end
it
{
should
be_ok
}
# This is a test to ensure that the username is included even if the
# This is a test to ensure that the username is included even if the
# thread's author is the one looking at the comment. This is because of a
# thread's author is the one looking at the comment. This is because of a
# regression in which we used User.only(:id, :read_states). This worked
# regression in which we used User.only(:id, :read_states). This worked
...
@@ -467,67 +473,72 @@ describe "app" do
...
@@ -467,67 +473,72 @@ describe "app" do
# missing the username and was not refetched.
# missing the username and was not refetched.
# BBEGGS - Note 8/4/2015: Identify map has been removed during the mongoid 4.x upgrade.
# BBEGGS - Note 8/4/2015: Identify map has been removed during the mongoid 4.x upgrade.
# Should no longer be an issue.
# Should no longer be an issue.
it
"includes the username even if the thread is being marked as read for the thread author"
do
it
'includes the username even if the thread is being marked as read for the thread author'
do
thread
=
CommentThread
.
first
expect
(
parse
(
subject
.
body
)).
to
include
(
'username'
=>
thread
.
author
.
username
)
expected_username
=
thread
.
author
.
username
end
get
"/api/v1/threads/
#{
thread
.
id
}
"
,
{
:user_id
=>
thread
.
author_id
,
:mark_as_read
=>
true
}
last_response
.
should
be_ok
response_thread
=
parse
last_response
.
body
response_thread
[
"username"
].
should
==
expected_username
end
end
it
"get information of a single comment thread with its comments"
do
context
'with comments'
do
thread
=
CommentThread
.
first
subject
do
get
"/api/v1/threads/
#{
thread
.
id
}
"
,
recursive:
true
get
"/api/v1/threads/
#{
thread
.
id
}
"
,
recursive:
true
last_response
.
should
be_ok
check_thread_result_json
(
nil
,
thread
,
parse
(
last_response
.
body
))
check_thread_response_paging_json
(
thread
,
parse
(
last_response
.
body
))
end
end
it
"returns 404 when the thread does not exist"
do
it
{
should
be_ok
}
thread
=
CommentThread
.
first
path
=
"/api/v1/threads/
#{
thread
.
id
}
"
it
'get information of a single comment thread with its comments'
do
get
path
parsed
=
parse
(
subject
.
body
)
last_response
.
should
be_ok
check_thread_result_json
(
nil
,
thread
,
parsed
)
check_thread_response_paging_json
(
thread
,
parsed
)
end
end
it
'returns 404 when the thread does not exist'
do
thread
.
destroy
thread
.
destroy
get
path
expect
(
subject
.
status
).
to
eq
404
last_response
.
status
.
should
==
404
expect
(
parse
(
last_response
.
body
).
first
).
to
eq
I18n
.
t
(
:requested_object_not_found
)
parse
(
last_response
.
body
).
first
.
should
==
I18n
.
t
(
:requested_object_not_found
)
end
end
it
"marks thread as read and confirms its value on returned response"
do
context
'with user specified'
do
user
=
create_test_user
(
123
)
let
(
:user
)
{
create
(
:user
)
}
thread
=
CommentThread
.
first
subject
do
user
.
mark_as_read
(
thread
)
user
.
mark_as_read
(
thread
)
get
"/api/v1/threads/
#{
thread
.
id
}
"
,
user_id:
user
.
id
get
"/api/v1/threads/
#{
thread
.
id
}
"
,
user_id:
user
.
id
last_response
.
should
be_ok
last_response
json_response
=
parse
(
last_response
.
body
)
end
changed_thread
=
CommentThread
.
find
(
thread
.
id
)
check_thread_result_json
(
user
,
changed_thread
,
json_response
)
it
{
should
be_ok
}
json_response
[
"read"
].
should
==
true
it
'marks thread as read and confirms its value on returned response'
do
parsed
=
parse
(
subject
.
body
)
thread
.
reload
check_thread_result_json
(
user
,
thread
,
parsed
)
expect
(
parsed
).
to
include
(
'read'
=>
true
)
end
end
end
def
test_unicode_data
(
text
)
def
test_unicode_data
(
text
)
thread
=
make_thread
(
User
.
first
,
text
,
"unicode_course"
,
"unicode_commentable"
)
thread
=
create
(
:comment_thread
,
body:
text
)
make_comment
(
User
.
first
,
thread
,
text
)
create
(
:comment
,
comment_thread:
thread
,
body:
text
)
get
"/api/v1/threads/
#{
thread
.
id
}
"
,
recursive:
true
get
"/api/v1/threads/
#{
thread
.
id
}
"
,
recursive:
true
last_response
.
should
be_ok
expect
(
last_response
).
to
be_ok
result
=
parse
last_response
.
body
check_thread_result_json
(
nil
,
thread
,
result
)
parsed
=
parse
(
last_response
.
body
)
check_thread_response_paging_json
(
thread
,
result
)
check_thread_result_json
(
nil
,
thread
,
parsed
)
check_thread_response_paging_json
(
thread
,
parsed
)
end
end
include_examples
"unicode data"
include_examples
'unicode data'
context
"response pagination"
do
context
"response pagination"
do
before
(
:each
)
do
before
(
:each
)
do
User
.
all
.
delete
User
.
all
.
delete
Content
.
all
.
delete
Content
.
all
.
delete
@user
=
create_test_user
(
999
)
@user
=
create_test_user
(
999
)
@threads
=
{}
@threads
=
{}
@comments
=
{}
@comments
=
{}
[
20
,
10
,
3
,
2
,
1
,
0
].
each
do
|
n
|
[
20
,
10
,
3
,
2
,
1
,
0
].
each
do
|
n
|
thread_key
=
"t
#{
n
}
"
thread_key
=
"t
#{
n
}
"
thread
=
make_thread
(
@user
,
thread_key
,
DFLT_COURSE_ID
,
"pdq"
)
thread
=
make_thread
(
@user
,
thread_key
,
DFLT_COURSE_ID
,
"pdq"
)
@threads
[
n
]
=
thread
@threads
[
n
]
=
thread
...
@@ -676,7 +687,7 @@ describe "app" do
...
@@ -676,7 +687,7 @@ describe "app" do
last_response
.
should
be_ok
last_response
.
should
be_ok
changed_thread
=
CommentThread
.
find
(
thread
.
id
)
changed_thread
=
CommentThread
.
find
(
thread
.
id
)
changed_thread
.
comment_count
.
should
==
orig_count
+
1
changed_thread
.
comment_count
.
should
==
orig_count
+
1
comment
=
changed_thread
.
comments
.
select
{
|
c
|
c
[
"body"
]
==
"new comment"
}.
first
comment
=
changed_thread
.
comments
.
select
{
|
c
|
c
[
"body"
]
==
"new comment"
}.
first
comment
.
should_not
be_nil
comment
.
should_not
be_nil
comment
.
author_id
.
should
==
user
.
id
comment
.
author_id
.
should
==
user
.
id
end
end
...
@@ -688,7 +699,7 @@ describe "app" do
...
@@ -688,7 +699,7 @@ describe "app" do
last_response
.
should
be_ok
last_response
.
should
be_ok
changed_thread
=
CommentThread
.
find
(
thread
.
id
)
changed_thread
=
CommentThread
.
find
(
thread
.
id
)
changed_thread
.
comment_count
.
should
==
orig_count
+
1
changed_thread
.
comment_count
.
should
==
orig_count
+
1
comment
=
changed_thread
.
comments
.
select
{
|
c
|
c
[
"body"
]
==
"new comment"
}.
first
comment
=
changed_thread
.
comments
.
select
{
|
c
|
c
[
"body"
]
==
"new comment"
}.
first
comment
.
should_not
be_nil
comment
.
should_not
be_nil
comment
.
anonymous
.
should
be_true
comment
.
anonymous
.
should
be_true
end
end
...
@@ -720,18 +731,29 @@ describe "app" do
...
@@ -720,18 +731,29 @@ describe "app" do
include_examples
"unicode data"
include_examples
"unicode data"
end
end
describe
"DELETE /api/v1/threads/:thread_id"
do
before
(
:each
)
{
init_without_subscriptions
}
describe
'DELETE /api/v1/threads/:thread_id'
do
it
"delete the comment thread and its comments"
do
let
(
:thread
)
{
create_comment_thread_and_comments
}
thread
=
CommentThread
.
first
.
to_hash
delete
"/api/v1/threads/
#{
thread
[
'id'
]
}
"
subject
{
delete
"/api/v1/threads/
#{
thread
.
id
}
"
}
last_response
.
should
be_ok
CommentThread
.
where
(
title:
thread
[
"title"
]).
first
.
should
be_nil
it
{
should
be_ok
}
it
'deletes the comment thread and its comments'
do
expect
(
CommentThread
.
where
(
id:
thread
.
id
).
count
).
to
eq
1
expect
(
Comment
.
where
(
comment_thread:
thread
).
count
).
to
eq
2
subject
expect
(
CommentThread
.
where
(
id:
thread
.
id
).
count
).
to
eq
0
expect
(
Comment
.
where
(
comment_thread:
thread
).
count
).
to
eq
0
end
context
'when thread does not exist'
do
subject
{
delete
'/api/v1/threads/does_not_exist'
}
it
'returns 400 when the thread does not exist'
do
expect
(
subject
.
status
).
to
eq
400
expect
(
parse
(
subject
.
body
).
first
).
to
eq
I18n
.
t
(
:requested_object_not_found
)
end
end
it
"returns 400 when the thread does not exist"
do
delete
"/api/v1/threads/does_not_exist"
last_response
.
status
.
should
==
400
parse
(
last_response
.
body
).
first
.
should
==
I18n
.
t
(
:requested_object_not_found
)
end
end
end
end
end
end
...
...
spec/api/commentable_spec.rb
View file @
bd47a000
require
'spec_helper'
require
'spec_helper'
require
'unicode_shared_examples'
require
'unicode_shared_examples'
describe
"app"
do
describe
'app'
do
describe
"commentables"
do
describe
'commentables'
do
before
(
:each
)
{
set_api_key_header
}
let
(
:commentable_id
)
{
Faker
::
Lorem
.
word
}
before
(
:each
)
do
describe
'DELETE /api/v1/:commentable_id/threads'
do
init_without_subscriptions
it
'delete all associated threads and comments of a commentable'
do
set_api_key_header
thread_count
=
2
create_list
(
:comment_thread
,
thread_count
,
commentable_id:
commentable_id
)
expect
(
Commentable
.
find
(
commentable_id
).
comment_threads
.
count
).
to
eq
thread_count
delete
"/api/v1/
#{
commentable_id
}
/threads"
expect
(
last_response
).
to
be_ok
expect
(
Commentable
.
find
(
commentable_id
).
comment_threads
.
count
).
to
eq
0
end
end
describe
"DELETE /api/v1/:commentable_id/threads"
do
context
'if the commentable does not exist'
do
it
"delete all associated threads and comments of a commentable"
do
subject
{
delete
'/api/v1/does_not_exist/threads'
}
delete
'/api/v1/question_1/threads'
last_response
.
should
be_ok
it
{
should
be_ok
}
Commentable
.
find
(
"question_1"
).
comment_threads
.
count
.
should
==
0
end
end
it
"handle normally when commentable does not exist"
do
end
delete
'/api/v1/does_not_exist/threads'
last_response
.
should
be_ok
describe
'GET /api/v1/:commentable_id/threads'
do
let
(
:returned_threads
)
{
parse
(
subject
.
body
)[
'collection'
]
}
subject
{
get
"/api/v1/
#{
commentable_id
}
/threads"
}
shared_examples_for
'a filterable API endpoint'
do
let!
(
:ignored_threads
)
{
create_list
(
:comment_thread
,
3
,
commentable_id:
commentable_id
)
}
subject
{
get
"/api/v1/
#{
commentable_id
}
/threads"
,
parameters
}
it
{
should
be_ok
}
it
'returns the correct CommentThreads'
do
expect
(
returned_threads
.
length
).
to
eq
threads
.
length
threads
.
sort_by!
(
&
:_id
).
reverse!
threads
.
each_with_index
do
|
thread
,
index
|
expect
(
returned_threads
[
index
]).
to
include
(
'id'
=>
thread
.
id
.
to_s
,
'body'
=>
thread
.
body
)
end
end
end
end
describe
"GET /api/v1/:commentable_id/threads"
do
end
def
thread_result
(
commentable_id
,
params
=
{})
get
"/api/v1/
#{
commentable_id
}
/threads"
,
params
context
'without filtering'
do
last_response
.
should
be_ok
let
(
:parameters
)
{
{}
}
parse
(
last_response
.
body
)[
"collection"
]
let!
(
:threads
)
{
ignored_threads
+
create_list
(
:comment_thread
,
3
,
:with_group_id
,
commentable_id:
commentable_id
)
}
end
it
"get all comment threads associated with a commentable object"
do
it_behaves_like
'a filterable API endpoint'
threads
=
thread_result
"question_1"
end
threads
.
length
.
should
==
2
threads
.
index
{
|
c
|
c
[
"body"
]
==
"can anyone help me?"
}.
should_not
be_nil
context
'when filtering by the standalone context'
do
threads
.
index
{
|
c
|
c
[
"body"
]
==
"it is unsolvable"
}.
should_not
be_nil
let
(
:parameters
)
{
{
context: :standalone
}
}
end
let!
(
:threads
)
{
create_list
(
:comment_thread
,
3
,
commentable_id:
commentable_id
,
context: :standalone
)
}
it
"returns standalone threads if explicitly requested"
do
threads
=
thread_result
"question_1"
,
context:
"standalone"
it_behaves_like
'a filterable API endpoint'
threads
.
length
.
should
==
1
end
threads
[
0
][
"body"
].
should
==
"no one can see us"
end
context
'when filtering by course_id'
do
it
"filters by course_id"
do
let
(
:course_id
)
{
Faker
::
Lorem
.
word
}
course1_threads
=
thread_result
"question_1"
,
course_id:
"1"
let
(
:parameters
)
{
{
course_id:
course_id
}
}
course1_threads
.
length
.
should
==
1
let!
(
:threads
)
{
create_list
(
:comment_thread
,
3
,
commentable_id:
commentable_id
,
course_id:
course_id
)
}
course2_threads
=
thread_result
"question_1"
,
course_id:
"2"
course2_threads
.
length
.
should
==
1
course1_threads
.
should_not
==
course2_threads
it_behaves_like
'a filterable API endpoint'
end
end
it
"filters by group_id"
do
group_thread
=
Commentable
.
find
(
"question_1"
).
comment_threads
.
sort
(
_id:
1
).
first
context
'when filtering by group_id'
do
threads
=
thread_result
"question_1"
,
group_id:
42
let
(
:group_id
)
{
Faker
::
Number
.
number
(
4
)
}
threads
.
length
.
should
==
2
let
(
:parameters
)
{
{
group_id:
group_id
}
}
group_thread
.
group_id
=
43
let!
(
:threads
)
{
create_list
(
:comment_thread
,
3
,
commentable_id:
commentable_id
,
group_id:
group_id
)
}
group_thread
.
save!
threads
=
thread_result
"question_1"
,
group_id:
42
threads
.
length
.
should
==
1
it_behaves_like
'a filterable API endpoint'
group_thread
.
group_id
=
42
end
group_thread
.
save!
threads
=
thread_result
"question_1"
,
group_id:
42
context
'when filtering by multiple group_id values'
do
threads
.
length
.
should
==
2
let
(
:group_ids
)
{
[
Faker
::
Number
.
number
(
4
),
Faker
::
Number
.
number
(
4
)]
}
end
let
(
:parameters
)
{
{
group_ids:
group_ids
.
join
(
','
)}
}
it
"filters by group_ids"
do
group_thread
=
Commentable
.
find
(
"question_1"
).
comment_threads
.
sort
(
_id:
1
).
first
group_thread
.
group_id
=
42
it_behaves_like
'a filterable API endpoint'
do
group_thread
.
save!
let!
(
:threads
)
do
threads
=
thread_result
"question_1"
,
group_ids:
"42,43"
threads
=
[]
threads
.
length
.
should
==
2
group_thread
.
group_id
=
43
group_ids
.
each
do
|
group_id
|
group_thread
.
save!
threads
+=
create_list
(
:comment_thread
,
3
,
commentable_id:
commentable_id
,
group_id:
group_id
)
threads
=
thread_result
"question_1"
,
group_ids:
"42,43"
end
threads
.
length
.
should
==
2
group_thread
.
group_id
=
44
threads
group_thread
.
save
end
threads
=
thread_result
"question_1"
,
group_ids:
"42,43"
end
threads
.
length
.
should
==
1
end
end
it
"returns an empty array when the commentable object does not exist (no threads)"
do
context
'when the commentable does not exist'
do
threads
=
thread_result
"does_not_exist"
subject
{
get
'/api/v1/does_not_exist/threads'
}
threads
.
length
.
should
==
0
it
{
should
be_ok
}
it
'should not return any results'
do
expect
(
returned_threads
.
length
).
to
eq
0
end
end
end
def
test_unicode_data
(
text
)
def
test_unicode_data
(
text
)
commentable_id
=
"unicode_commentable"
commentable_id
=
'unicode_commentable'
thread
=
make_thread
(
User
.
first
,
text
,
"unicode_course"
,
commentable_id
)
thread
=
create
(
:comment_thread
,
commentable_id:
commentable_id
,
body:
text
)
make_comment
(
User
.
first
,
thread
,
text
)
create
(
:comment
,
comment_thread:
thread
,
body:
text
)
get
"/api/v1/
#{
commentable_id
}
/threads"
get
"/api/v1/
#{
commentable_id
}
/threads"
last_response
.
should
be_ok
last_response
.
should
be_ok
result
=
parse
(
last_response
.
body
)[
"collection"
]
result
=
parse
(
last_response
.
body
)[
'collection'
]
result
.
should_not
be_empty
result
.
should_not
be_empty
check_thread_result_json
(
nil
,
thread
,
result
.
first
)
check_thread_result_json
(
nil
,
thread
,
result
.
first
)
end
end
include_examples
"unicode data"
include_examples
'unicode data'
end
end
describe
"POST /api/v1/:commentable_id/threads"
do
let
(
:default_params
)
do
describe
'POST /api/v1/:commentable_id/threads'
do
{
title:
"Interesting question"
,
body:
"cool"
,
course_id:
"1"
,
user_id:
"1"
}
let
(
:commentable_id
)
{
Faker
::
Lorem
.
word
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:parameters
)
{
attributes_for
(
:comment_thread
,
user_id:
user
.
id
)
}
subject
{
post
"/api/v1/
#{
commentable_id
}
/threads"
,
parameters
}
shared_examples_for
'CommentThread creation API'
do
|
context
=
'course'
|
it
'creates a new CommentThread'
do
expect
(
CommentThread
.
count
).
to
eq
0
body
=
parse
(
subject
.
body
)
expect
(
body
).
to
include
(
'read'
=>
false
,
'unread_comments_count'
=>
0
,
'endorsed'
=>
false
,
'resp_total'
=>
0
)
expect
(
CommentThread
.
count
).
to
eq
1
thread
=
CommentThread
.
find
(
body
[
'id'
])
expect
(
thread
).
to_not
be_nil
expect
(
thread
.
context
).
to
eq
context
end
end
it
"create a new comment thread for the commentable object"
do
old_count
=
CommentThread
.
count
post
'/api/v1/question_1/threads'
,
default_params
last_response
.
should
be_ok
result
=
parse
(
last_response
.
body
)
result
[
"read"
].
should
==
false
result
[
"unread_comments_count"
].
should
==
0
result
[
"endorsed"
].
should
==
false
result
[
"resp_total"
].
should
==
0
CommentThread
.
count
.
should
==
old_count
+
1
thread
=
CommentThread
.
where
(
title:
"Interesting question"
).
first
thread
.
should_not
be_nil
thread
.
context
.
should
==
"course"
end
it
"can create a standalone thread"
do
old_count
=
CommentThread
.
count
post
'/api/v1/question_1/threads'
,
default_params
.
merge
(
:context
=>
"standalone"
)
CommentThread
.
count
.
should
==
old_count
+
1
thread
=
CommentThread
.
where
(
title:
"Interesting question"
).
first
thread
.
should_not
be_nil
thread
.
context
.
should
==
"standalone"
end
end
it
{
should
be_ok
}
it_behaves_like
'CommentThread creation API'
it_behaves_like
'CommentThread creation API'
,
'standalone'
do
let
(
:parameters
)
{
attributes_for
(
:comment_thread
,
user_id:
user
.
id
,
context:
'standalone'
)
}
end
CommentThread
.
thread_type
.
values
.
each
do
|
thread_type
|
CommentThread
.
thread_type
.
values
.
each
do
|
thread_type
|
it
"can create a
#{
thread_type
}
thread"
do
it
"can create a
#{
thread_type
}
thread"
do
old_count
=
CommentThread
.
where
(
thread_type:
thread_type
).
count
old_count
=
CommentThread
.
where
(
thread_type:
thread_type
).
count
post
"/api/v1/question_1/threads"
,
default_param
s
.
merge
(
thread_type:
thread_type
.
to_s
)
post
'/api/v1/question_1/threads'
,
parameter
s
.
merge
(
thread_type:
thread_type
.
to_s
)
last_response
.
should
be_ok
last_response
.
should
be_ok
parse
(
last_response
.
body
)[
"thread_type"
].
should
==
thread_type
.
to_s
parse
(
last_response
.
body
)[
'thread_type'
].
should
==
thread_type
.
to_s
CommentThread
.
where
(
thread_type:
thread_type
).
count
.
should
==
old_count
+
1
CommentThread
.
where
(
thread_type:
thread_type
).
count
.
should
==
old_count
+
1
end
end
end
end
it
"allows anonymous thread"
do
old_count
=
CommentThread
.
count
it
'allows anonymous thread'
do
post
'/api/v1/question_1/threads'
,
default_params
.
merge
(
anonymous:
true
)
post
'/api/v1/question_1/threads'
,
parameters
.
merge!
(
anonymous:
true
)
last_response
.
should
be_ok
CommentThread
.
count
.
should
==
old_count
+
1
c
=
CommentThread
.
where
(
title:
"Interesting question"
).
first
c
.
should_not
be_nil
c
[
"anonymous"
].
should
be_true
end
it
"create a new comment thread for a new commentable object"
do
post
'/api/v1/does_not_exist/threads'
,
default_params
last_response
.
should
be_ok
last_response
.
should
be_ok
Commentable
.
find
(
"does_not_exist"
).
comment_threads
.
length
.
should
==
1
body
=
parse
(
subject
.
body
)
Commentable
.
find
(
"does_not_exist"
).
comment_threads
.
first
.
body
.
should
==
"cool"
thread
=
CommentThread
.
find
(
body
[
'id'
])
expect
(
thread
).
to_not
be_nil
expect
(
thread
[
'anonymous'
]).
to
be_true
end
end
it
"returns error when title, body or course id does not exist"
do
params
=
default_params
.
dup
it
'returns error when title, body or course id does not exist'
do
params
.
delete
(
:title
)
[
:title
,
:body
,
:course_id
].
each
do
|
parameter
|
post
'/api/v1/question_1/threads'
,
params
params
=
parameters
.
dup
last_response
.
status
.
should
==
400
params
.
delete
(
parameter
)
params
=
default_params
.
dup
params
.
delete
(
:body
)
post
'/api/v1/question_1/threads'
,
params
last_response
.
status
.
should
==
400
params
=
default_params
.
dup
params
.
delete
(
:course_id
)
post
'/api/v1/question_1/threads'
,
params
post
'/api/v1/question_1/threads'
,
params
last_response
.
status
.
should
==
400
last_response
.
status
.
should
==
400
end
end
end
it
"returns error when title or body is blank (only consists of spaces and new lines)"
do
it
"returns error when title or body is blank (only consists of spaces and new lines)"
do
post
'/api/v1/question_1/threads'
,
default_param
s
.
merge
(
title:
" "
)
post
'/api/v1/question_1/threads'
,
parameter
s
.
merge
(
title:
" "
)
last_response
.
status
.
should
==
400
last_response
.
status
.
should
==
400
post
'/api/v1/question_1/threads'
,
default_param
s
.
merge
(
body:
"
\n
\n
"
)
post
'/api/v1/question_1/threads'
,
parameter
s
.
merge
(
body:
"
\n
\n
"
)
last_response
.
status
.
should
==
400
last_response
.
status
.
should
==
400
end
end
it
"returns 503 and does not create when the post content is blocked"
do
post
'/api/v1/question_1/threads'
,
default_params
.
merge
(
body:
"BLOCKED POST"
)
it
'returns 503 and does not create when the post content is blocked'
do
body
=
'BLOCKED POST'
hash
=
block_post_body
post
'/api/v1/question_1/threads'
,
parameters
.
merge!
(
body:
body
)
last_response
.
status
.
should
==
503
last_response
.
status
.
should
==
503
parse
(
last_response
.
body
).
first
.
should
==
I18n
.
t
(
:blocked_content_with_body_hash
,
:hash
=>
Digest
::
MD5
.
hexdigest
(
"blocked post"
)
)
parse
(
last_response
.
body
).
first
.
should
==
I18n
.
t
(
:blocked_content_with_body_hash
,
:hash
=>
hash
)
CommentThread
.
where
(
body:
"BLOCKED POST"
).
to_a
.
should
be_empty
expect
(
CommentThread
.
where
(
body:
body
).
length
).
to
eq
0
end
end
def
test_unicode_data
(
text
)
def
test_unicode_data
(
text
)
commentable_id
=
"unicode_commentable"
commentable_id
=
'unicode_commentable'
post
"/api/v1/
#{
commentable_id
}
/threads"
,
default_params
.
merge
(
body:
text
,
title:
text
)
post
"/api/v1/
#{
commentable_id
}
/threads"
,
parameters
.
merge!
(
body:
text
,
title:
text
)
last_response
.
should
be_ok
last_response
.
should
be_ok
CommentThread
.
where
(
commentable_id:
commentable_id
,
body:
text
,
title:
text
).
should
_not
be_empty
expect
(
CommentThread
.
where
(
commentable_id:
commentable_id
,
body:
text
,
title:
text
)).
to
_not
be_empty
end
end
include_examples
"unicode data"
include_examples
'unicode data'
end
end
end
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment