Add tests for the new object and fix a bug

Each of the individual query chunks has their own test, in addition to a
test for the full combination of parameters that could influence a
query.

There is also a bugfix for the tag query in here, since I want, as much
as possible, to have passing tests on every commit.
This commit is contained in:
Matt Rogers 2019-04-11 09:53:53 -05:00
parent df091c7ec5
commit fc17a03bc0
No known key found for this signature in database
GPG key ID: 605D017C07EB4316
5 changed files with 154 additions and 2 deletions

View file

@ -27,7 +27,7 @@ module Todos
if params[:tag]
tag = Tag.where(:name => params['tag']).first
not_done_todos = not_done_todos.where('taggings.tag_id = ?', tag.id)
not_done_todos = not_done_todos.joins(:taggings).where('taggings.tag_id = ?', tag.id)
end
if params[:context_id]

View file

@ -56,3 +56,13 @@ attendrailsconf:
user_id: 2
created_at: <%= today %>
updated_at: <%= today %>
attendgophercon:
id: 5
name: Attend Gophercon
description: 'Because those little gopher drawing are cute'
position: 2
state: 'active'
user_id: 2
created_at: <%= today %>
updated_at: <%= today %>

View file

@ -22,4 +22,16 @@ foo2:
id: 4
tag_id: 1
taggable_id: 3 # Buy milk - completed
taggable_type: Todo
taggable_type: Todo
bar1:
id: 5
tag_id: 2
taggable_id: 16
taggable_type: Todo
bar2:
tag_id: 2
taggable_id: 20
taggable_type: Todo

View file

@ -4,10 +4,17 @@
# rails does automatically in models or controllers! Convert to utc manually!
<%
def yesterday
Time.zone.now.utc.beginning_of_day - 1.day
end
def today
Time.zone.now.utc.beginning_of_day.to_s(:db)
end
def tomorrow
(Time.zone.now.utc.beginning_of_day + 1.day).to_s(:db)
end
def next_week
1.week.from_now.utc.beginning_of_day.to_s(:db)
end
@ -255,3 +262,29 @@ email_broker:
description: Ask about better stocks
notes: ~
state: pending
package_delivered:
id: 20
context_id: 11
project_id: 5
description: Package delivery date
notes: ~
state: active
created_at: <%= two_weeks_ago %>
due: <%= today %>
completed_at: ~
show_from: ~
user_id: 2
assemble_furniture:
id: 21
context_id: 11
project_id: 5
description: Put together the furniture we bought
notes: ~
state: completed
created_at: <%= two_weeks_ago %>
due: <%= today %>
completed_at: <%= yesterday %>
show_from: ~
user_id: 2

View file

@ -0,0 +1,97 @@
require 'test_helper'
module Todos
class UndoneTodosQueryTest < ActiveSupport::TestCase
def test_requires_a_user
assert_raises(ArgumentError) { UndoneTodosQuery.new }
end
def test_default_query_is_all_active_not_hidden_todos
user = users(:other_user)
undone_todos = UndoneTodosQuery.new(user).query({})
expected = [todos(:package_delivered),
todos(:buy_tix),
todos(:pal_confirmation)]
assert_equal expected, undone_todos.to_a
end
def test_filtering_by_done
user = users(:other_user)
# This gets everything done from a week ago until now
undone_todos = UndoneTodosQuery.new(user).query(done: '7')
expected = [todos(:assemble_furniture)]
assert_equal expected, undone_todos.to_a
end
def test_limiting_results
user = users(:other_user)
undone_todos = UndoneTodosQuery.new(user).query(limit: '1')
expected = [todos(:package_delivered)]
assert_equal expected, undone_todos.to_a
end
def test_filtering_by_due_date
user = users(:other_user)
# FIXME normalize HashWithIndifferentHash usage
# Only gets todos that are due today or are past their due date.
undone_todos = UndoneTodosQuery.new(user).query(due: '0', 'due' => '0')
expected = [todos(:package_delivered)]
assert_equal expected, undone_todos.to_a
end
def test_filtering_by_tag
user = users(:other_user)
# FIXME normalize HashWithIndifferentHash usage
undone_todos = UndoneTodosQuery.new(user).query(tag: 'bar', "tag" => "bar")
expected = [todos(:package_delivered),
todos(:buy_tix)]
assert_equal expected, undone_todos.to_a
end
def test_filtering_by_context
user = users(:other_user)
# FIXME normalize HashWithIndifferentHash usage
undone_todos = UndoneTodosQuery.new(user).query(context_id: '11', 'context_id' => '11')
expected = [todos(:package_delivered),
todos(:pal_confirmation)]
assert_equal expected, undone_todos.to_a
end
def test_using_a_non_existant_context_raises_an_exception
user = users(:other_user)
# FIXME normalize HashWithIndifferentHash usage
assert_raises(ActiveRecord::RecordNotFound) do
undone_todos = UndoneTodosQuery.new(user).query(context_id: '110', 'context_id' => '110')
end
end
def test_filtering_by_project
user = users(:other_user)
# FIXME normalize HashWithIndifferentHash usage
undone_todos = UndoneTodosQuery.new(user).query(project_id: '5', 'project_id' => '5')
expected = [todos(:package_delivered)]
assert_equal expected, undone_todos.to_a
end
def test_using_a_non_existant_project_raises_an_exception
user = users(:other_user)
# FIXME normalize HashWithIndifferentHash usage
assert_raises(ActiveRecord::RecordNotFound) do
undone_todos = UndoneTodosQuery.new(user).query(project_id: '110', 'project_id' => '110')
end
end
def test_combination_of_all_params
user = users(:other_user)
# FIXME normalize HashWithIndifferentHash usage
undone_todos = UndoneTodosQuery.new(user).query({
limit: "1",
project_id: "5", "project_id" => "5",
context_id: "11", "context_id" => "11",
tag: "bar", "tag" => "bar",
due: "0", "due" => "0"})
expected = [todos(:package_delivered)]
assert_equal expected, undone_todos.to_a
end
end
end