diff options
Diffstat (limited to 'help')
-rw-r--r-- | help/app/designs/ticket/by_includes_post_by.js | 13 | ||||
-rw-r--r-- | help/app/designs/ticket/by_includes_post_by_and_created_at.js | 12 | ||||
-rw-r--r-- | help/app/designs/ticket/by_includes_post_by_and_is_open_and_created_at.js | 12 | ||||
-rw-r--r-- | help/app/designs/ticket/by_includes_post_by_and_is_open_and_updated_at.js | 12 | ||||
-rw-r--r-- | help/app/designs/ticket/by_includes_post_by_and_updated_at.js | 12 | ||||
-rw-r--r-- | help/app/models/ticket.rb | 81 | ||||
-rw-r--r-- | help/app/views/tickets/_comment.html.haml | 6 | ||||
-rw-r--r-- | help/app/views/tickets/_new_comment.html.haml | 2 | ||||
-rw-r--r-- | help/app/views/tickets/_ticket.html.haml | 22 | ||||
-rw-r--r-- | help/app/views/tickets/_ticket_data.html.haml | 2 | ||||
-rw-r--r-- | help/app/views/tickets/new.html.haml | 2 | ||||
-rw-r--r-- | help/app/views/tickets/show.html.haml | 2 | ||||
-rw-r--r-- | help/test/factories.rb | 10 | ||||
-rw-r--r-- | help/test/functional/tickets_controller_test.rb | 110 | ||||
-rw-r--r-- | help/test/unit/ticket_comment_test.rb | 5 | ||||
-rw-r--r-- | help/test/unit/ticket_test.rb | 1 |
16 files changed, 152 insertions, 152 deletions
diff --git a/help/app/designs/ticket/by_includes_post_by.js b/help/app/designs/ticket/by_includes_post_by.js new file mode 100644 index 0000000..2eeac89 --- /dev/null +++ b/help/app/designs/ticket/by_includes_post_by.js @@ -0,0 +1,13 @@ +// TODO: This view is only used in tests--should we keep it? +function(doc) { + var arr = {} + if (doc['type'] == 'Ticket' && doc.comments) { + doc.comments.forEach(function(comment){ + if (comment.posted_by && !arr[comment.posted_by]) { + //don't add duplicates + arr[comment.posted_by] = true; + emit(comment.posted_by, 1); + } + }); + } +} diff --git a/help/app/designs/ticket/by_includes_post_by_and_created_at.js b/help/app/designs/ticket/by_includes_post_by_and_created_at.js new file mode 100644 index 0000000..72169b0 --- /dev/null +++ b/help/app/designs/ticket/by_includes_post_by_and_created_at.js @@ -0,0 +1,12 @@ +function(doc) { + var arr = {} + if (doc['type'] == 'Ticket' && doc.comments) { + doc.comments.forEach(function(comment){ + if (comment.posted_by && !arr[comment.posted_by]) { + //don't add duplicates + arr[comment.posted_by] = true; + emit([comment.posted_by, doc.created_at], 1); + } + }); + } +} diff --git a/help/app/designs/ticket/by_includes_post_by_and_is_open_and_created_at.js b/help/app/designs/ticket/by_includes_post_by_and_is_open_and_created_at.js new file mode 100644 index 0000000..33dfe0b --- /dev/null +++ b/help/app/designs/ticket/by_includes_post_by_and_is_open_and_created_at.js @@ -0,0 +1,12 @@ +function(doc) { + var arr = {} + if (doc['type'] == 'Ticket' && doc.comments) { + doc.comments.forEach(function(comment){ + if (comment.posted_by && !arr[comment.posted_by]) { + //don't add duplicates + arr[comment.posted_by] = true; + emit([comment.posted_by, doc.is_open, doc.created_at], 1); + } + }); + } +} diff --git a/help/app/designs/ticket/by_includes_post_by_and_is_open_and_updated_at.js b/help/app/designs/ticket/by_includes_post_by_and_is_open_and_updated_at.js new file mode 100644 index 0000000..3bd2a74 --- /dev/null +++ b/help/app/designs/ticket/by_includes_post_by_and_is_open_and_updated_at.js @@ -0,0 +1,12 @@ +function(doc) { + var arr = {} + if (doc['type'] == 'Ticket' && doc.comments) { + doc.comments.forEach(function(comment){ + if (comment.posted_by && !arr[comment.posted_by]) { + //don't add duplicates + arr[comment.posted_by] = true; + emit([comment.posted_by, doc.is_open, doc.updated_at], 1); + } + }); + } +} diff --git a/help/app/designs/ticket/by_includes_post_by_and_updated_at.js b/help/app/designs/ticket/by_includes_post_by_and_updated_at.js new file mode 100644 index 0000000..2b4304f --- /dev/null +++ b/help/app/designs/ticket/by_includes_post_by_and_updated_at.js @@ -0,0 +1,12 @@ +function(doc) { + var arr = {} + if (doc['type'] == 'Ticket' && doc.comments) { + doc.comments.forEach(function(comment){ + if (comment.posted_by && !arr[comment.posted_by]) { + //don't add duplicates + arr[comment.posted_by] = true; + emit([comment.posted_by, doc.updated_at], 1); + } + }); + } +} diff --git a/help/app/models/ticket.rb b/help/app/models/ticket.rb index 262d5a4..ed1ff9d 100644 --- a/help/app/models/ticket.rb +++ b/help/app/models/ticket.rb @@ -47,84 +47,7 @@ class Ticket < CouchRest::Model::Base view :by_is_open_and_created_at view :by_is_open_and_updated_at - - #TODO: This view is only used in tests--should we keep it? - view :by_includes_post_by, - :map => - "function(doc) { - var arr = {} - if (doc['type'] == 'Ticket' && doc.comments) { - doc.comments.forEach(function(comment){ - if (comment.posted_by && !arr[comment.posted_by]) { - //don't add duplicates - arr[comment.posted_by] = true; - emit(comment.posted_by, 1); - } - }); - } - }", :reduce => "function(k,v,r) { return sum(v); }" - - view :by_includes_post_by_and_is_open_and_updated_at, - :map => - "function(doc) { - var arr = {} - if (doc['type'] == 'Ticket' && doc.comments) { - doc.comments.forEach(function(comment){ - if (comment.posted_by && !arr[comment.posted_by]) { - //don't add duplicates - arr[comment.posted_by] = true; - emit([comment.posted_by, doc.is_open, doc.updated_at], 1); - } - }); - } - }", :reduce => "function(k,v,r) { return sum(v); }" - - view :by_includes_post_by_and_is_open_and_created_at, - :map => - "function(doc) { - var arr = {} - if (doc['type'] == 'Ticket' && doc.comments) { - doc.comments.forEach(function(comment){ - if (comment.posted_by && !arr[comment.posted_by]) { - //don't add duplicates - arr[comment.posted_by] = true; - emit([comment.posted_by, doc.is_open, doc.created_at], 1); - } - }); - } - }", :reduce => "function(k,v,r) { return sum(v); }" - - view :by_includes_post_by_and_updated_at, - :map => - "function(doc) { - var arr = {} - if (doc['type'] == 'Ticket' && doc.comments) { - doc.comments.forEach(function(comment){ - if (comment.posted_by && !arr[comment.posted_by]) { - //don't add duplicates - arr[comment.posted_by] = true; - emit([comment.posted_by, doc.updated_at], 1); - } - }); - } - }", :reduce => "function(k,v,r) { return sum(v); }" - - - view :by_includes_post_by_and_created_at, - :map => - "function(doc) { - var arr = {} - if (doc['type'] == 'Ticket' && doc.comments) { - doc.comments.forEach(function(comment){ - if (comment.posted_by && !arr[comment.posted_by]) { - //don't add duplicates - arr[comment.posted_by] = true; - emit([comment.posted_by, doc.created_at], 1); - } - }); - } - }", :reduce => "function(k,v,r) { return sum(v); }" - + load_views(Rails.root.join('help', 'app', 'designs', 'ticket')) end validates :title, :presence => true @@ -132,7 +55,7 @@ class Ticket < CouchRest::Model::Base # html5 has built-in validation which isn't ideal, as it says 'please enter an email address' for invalid email addresses, which implies an email address is required, and it is not. - validates :email, :format => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/, :if => :email #email address is optional + validates :email, :allow_blank => true, :format => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/ #TODO: #def set_created_by diff --git a/help/app/views/tickets/_comment.html.haml b/help/app/views/tickets/_comment.html.haml index 01cf01a..501ceec 100644 --- a/help/app/views/tickets/_comment.html.haml +++ b/help/app/views/tickets/_comment.html.haml @@ -7,7 +7,8 @@ = 'Posted by' + (comment.posted_by_user.is_admin? ? ' admin' : '') + ':' = comment.posted_by_user.login - else - Unauthenticated post + %b + Unauthenticated post - if comment.private (Private comment) .pull-right @@ -15,4 +16,5 @@ Posted at: = comment.posted_at.to_s(:short) %br - = comment.body
\ No newline at end of file + = comment.body + diff --git a/help/app/views/tickets/_new_comment.html.haml b/help/app/views/tickets/_new_comment.html.haml index 8d40bb6..96388ea 100644 --- a/help/app/views/tickets/_new_comment.html.haml +++ b/help/app/views/tickets/_new_comment.html.haml @@ -1,4 +1,4 @@ = f.simple_fields_for :comments, @comment do |c| - = c.input :body, :label => 'Comment', :as => :text, :input_html => {:class => "span12", :rows=>4} + = c.input :body, :label => 'Comment', :as => :text, :input_html => {:class => "span9", :rows=>4} - if admin? = c.input :private, :as => :boolean, :label => false, :inline_label => true diff --git a/help/app/views/tickets/_ticket.html.haml b/help/app/views/tickets/_ticket.html.haml index 3edfa8b..7b37652 100644 --- a/help/app/views/tickets/_ticket.html.haml +++ b/help/app/views/tickets/_ticket.html.haml @@ -1,13 +1,17 @@ +- updated_at_text = 'updated: ' + ticket.updated_at.to_s(:long) %tr %td %b = link_to ticket.title, ticket - %br - %small - created: - = ticket.created_at.to_s(:short) - updated: - = ticket.updated_at.to_s(:short) - %small.pull-right - comments by: - = ticket.commenters + - if params[:controller] == 'tickets' + %br + %small + created: + = ticket.created_at.to_s(:long) + = updated_at_text + %small.pull-right + comments by: + = ticket.commenters + - else + %small + = updated_at_text
\ No newline at end of file diff --git a/help/app/views/tickets/_ticket_data.html.haml b/help/app/views/tickets/_ticket_data.html.haml index 2261d8f..d68d3e9 100644 --- a/help/app/views/tickets/_ticket_data.html.haml +++ b/help/app/views/tickets/_ticket_data.html.haml @@ -32,4 +32,4 @@ = button_to 'Close', {:post => {:is_open => false}}, :method => :put, :class => 'btn btn-small' - else = 'closed' - = button_to 'Open', {:post => {:is_open => true}}, :method => :put, :class => 'btn btn-small'
\ No newline at end of file + = button_to 'Open', {:post => {:is_open => true}}, :method => :put, :class => 'btn btn-small' diff --git a/help/app/views/tickets/new.html.haml b/help/app/views/tickets/new.html.haml index af8baad..1aa689b 100644 --- a/help/app/views/tickets/new.html.haml +++ b/help/app/views/tickets/new.html.haml @@ -1,6 +1,6 @@ .span12 %h2=t :new_ticket - = simple_form_for(@ticket, :html => {:novalidate => true}) do |f| #turn off html5 validations to test + = simple_form_for @ticket, :validate => true, :html => {:class => 'form-horizontal'} do |f| = f.input :title = f.input :email if !current_user #hmm--might authenticated users want to submit an alternate email? = f.input :regarding_user diff --git a/help/app/views/tickets/show.html.haml b/help/app/views/tickets/show.html.haml index 3f00b35..a69048b 100644 --- a/help/app/views/tickets/show.html.haml +++ b/help/app/views/tickets/show.html.haml @@ -8,7 +8,7 @@ = render(:partial => "comment", :collection => @ticket.comments) = #render @ticket.comments should work if view is in /app/views/comments/_comment - = simple_form_for(@ticket, :html => {:novalidate => true}) do |f| #turn off html5 validations to test + = simple_form_for @ticket, :html => {:class => 'form-horizontal'} do |f| # don't need validations so long as this is so simple = render :partial => 'new_comment', :locals => {:f => f} .span10.offset3 = f.button :submit, @post_reply_str, :class => 'btn-primary' diff --git a/help/test/factories.rb b/help/test/factories.rb new file mode 100644 index 0000000..5b38952 --- /dev/null +++ b/help/test/factories.rb @@ -0,0 +1,10 @@ +FactoryGirl.define do + + factory :ticket do + title { Faker::Lorem.sentence } + comments_attributes do + { "0" => { "body" => Faker::Lorem.sentences.join(" ") } } + end + end + +end diff --git a/help/test/functional/tickets_controller_test.rb b/help/test/functional/tickets_controller_test.rb index 7060936..0c462a9 100644 --- a/help/test/functional/tickets_controller_test.rb +++ b/help/test/functional/tickets_controller_test.rb @@ -3,21 +3,17 @@ require 'test_helper' class TicketsControllerTest < ActionController::TestCase setup do - User.create(User.valid_attributes_hash.merge({:login => 'first_test'})) - User.create(User.valid_attributes_hash.merge({:login => 'different'})) - Ticket.create( {:title => "stub test ticket", :id => 'stubtestticketid', :comments_attributes => {"0" => {"body" =>"body of stubbed test ticket"}}}) - Ticket.create( {:title => "stub test ticket two", :id => 'stubtestticketid2', :comments_attributes => {"0" => {"body" =>"body of second stubbed test ticket"}}}) + @user = FactoryGirl.create :user + @other_user = FactoryGirl.create :user end teardown do - User.find_by_login('first_test').destroy - User.find_by_login('different').destroy - Ticket.find('stubtestticketid').destroy - Ticket.find('stubtestticketid2').destroy + @user.destroy + @other_user.destroy end test "should get index if logged in" do - login :is_admin? => false + login get :index assert_response :success assert_not_nil assigns(:tickets) @@ -35,29 +31,32 @@ class TicketsControllerTest < ActionController::TestCase assert_response :success end - test "ticket show access" do - ticket = Ticket.first - ticket.created_by = nil # TODO: hacky, but this makes sure this ticket is an unauthenticated one - ticket.save + test "unauthenticated tickets are visible" do + ticket = find_record :ticket, :created_by => nil get :show, :id => ticket.id assert_response :success + end - ticket.created_by = User.last.id - ticket.save + test "user tickets are not visible without login" do + ticket = find_record :ticket, :created_by => @user.id get :show, :id => ticket.id assert_response :redirect assert_redirected_to login_url + end - login(User.last) + test "user tickets are visible to creator" do + ticket = find_record :ticket, :created_by => @user.id + login @user get :show, :id => ticket.id assert_response :success + end - login(User.first) #assumes User.first != User.last: - assert_not_equal User.first, User.last + test "user tickets are not visible to other user" do + ticket = find_record :ticket, :created_by => @user.id + login @other_user get :show, :id => ticket.id assert_response :redirect assert_redirected_to root_url - end test "should create unauthenticated ticket" do @@ -80,7 +79,7 @@ class TicketsControllerTest < ActionController::TestCase params = {:title => "auth ticket test title", :comments_attributes => {"0" => {"body" =>"body of test ticket"}}} - login :email => "test@email.net" + login :email => Faker::Internet.user_name + '@' + APP_CONFIG[:domain] assert_difference('Ticket.count') do post :create, :ticket => params @@ -99,11 +98,9 @@ class TicketsControllerTest < ActionController::TestCase end test "add comment to unauthenticated ticket" do - ticket = Ticket.find('stubtestticketid') - ticket.created_by = nil # TODO: hacky, but this makes sure this ticket is an unauthenticated one - ticket.save + ticket = FactoryGirl.create :ticket, :created_by => nil - assert_difference('Ticket.find("stubtestticketid").comments.count') do + assert_difference('Ticket.find(ticket.id).comments.count') do put :update, :id => ticket.id, :ticket => {:comments_attributes => {"0" => {"body" =>"NEWER comment"}} } end @@ -111,24 +108,24 @@ class TicketsControllerTest < ActionController::TestCase assert_equal ticket, assigns(:ticket) # still same ticket, with different comments assert_not_equal ticket.comments, assigns(:ticket).comments # ticket == assigns(:ticket), but they have different comments (which we want) + assigns(:ticket).destroy end test "add comment to own authenticated ticket" do login User.last - ticket = Ticket.find('stubtestticketid') - ticket.created_by = @current_user.id # TODO: hacky, but confirms it is their ticket - ticket.save + ticket = FactoryGirl.create :ticket, :created_by => @current_user.id #they should be able to comment if it is their ticket: - assert_difference('Ticket.find("stubtestticketid").comments.count') do + assert_difference('Ticket.find(ticket.id).comments.count') do put :update, :id => ticket.id, :ticket => {:comments_attributes => {"0" => {"body" =>"NEWER comment"}} } end assert_not_equal ticket.comments, assigns(:ticket).comments assert_not_nil assigns(:ticket).comments.last.posted_by assert_equal assigns(:ticket).comments.last.posted_by, @current_user.id + assigns(:ticket).destroy end @@ -136,17 +133,13 @@ class TicketsControllerTest < ActionController::TestCase test "cannot comment if it is not your ticket" do login :is_admin? => false, :email => nil - ticket = Ticket.first - - assert_not_nil User.first.id - ticket.created_by = User.first.id - ticket.save + ticket = FactoryGirl.create :ticket, :created_by => @other_user.id # they should *not* be able to comment if it is not their ticket put :update, :id => ticket.id, :ticket => {:comments_attributes => {"0" => {"body" =>"not allowed comment"}} } assert_response :redirect assert_access_denied - assert_equal ticket.comments, assigns(:ticket).comments + assert_equal ticket.comments.map(&:body), assigns(:ticket).comments.map(&:body) end @@ -155,14 +148,10 @@ class TicketsControllerTest < ActionController::TestCase login :is_admin? => true - ticket = Ticket.find('stubtestticketid') - assert_not_nil User.last.id - ticket.created_by = User.last.id # TODO: hacky, but confirms it somebody elses ticket: - assert_not_equal User.last.id, @current_user.id - ticket.save + ticket = FactoryGirl.create :ticket, :created_by => @other_user.id #admin should be able to comment: - assert_difference('Ticket.find("stubtestticketid").comments.count') do + assert_difference('Ticket.find(ticket.id).comments.count') do put :update, :id => ticket.id, :ticket => {:comments_attributes => {"0" => {"body" =>"NEWER comment"}} } end @@ -170,9 +159,11 @@ class TicketsControllerTest < ActionController::TestCase assert_not_nil assigns(:ticket).comments.last.posted_by assert_equal assigns(:ticket).comments.last.posted_by, @current_user.id + assigns(:ticket).destroy end test "tickets by admin" do + ticket = FactoryGirl.create :ticket, :created_by => @other_user.id login :is_admin? => true, :email => nil @@ -189,17 +180,18 @@ class TicketsControllerTest < ActionController::TestCase test "admin_status mine vs all" do - testticket = Ticket.create :title => 'temp testytest' + testticket = FactoryGirl.create :ticket login :is_admin? => true, :email => nil get :index, {:admin_status => "all", :open_status => "open"} assert assigns(:all_tickets).include?(testticket) get :index, {:admin_status => "mine", :open_status => "open"} assert !assigns(:all_tickets).include?(testticket) + testticket.destroy end test "commenting on a ticket adds to tickets that are mine" do - testticket = Ticket.create :title => 'temp testytest' + testticket = FactoryGirl.create :ticket login :is_admin? => true, :email => nil get :index, {:admin_status => "mine", :open_status => "open"} @@ -216,6 +208,7 @@ class TicketsControllerTest < ActionController::TestCase end test "admin ticket ordering" do + tickets = FactoryGirl.create_list :ticket, 2 login :is_admin? => true, :email => nil get :index, {:admin_status => "all", :open_status => "open", :sort_order => 'created_at_desc'} @@ -234,33 +227,36 @@ class TicketsControllerTest < ActionController::TestCase assert_not_equal first_tick, assigns(:all_tickets).first assert_not_equal last_tick, assigns(:all_tickets).last + tickets.each {|ticket| ticket.destroy} end test "tickets for regular user" do - login :is_admin? => false, :email => nil + login + ticket = FactoryGirl.create :ticket + other_ticket = FactoryGirl.create :ticket - put :update, :id => 'stubtestticketid',:ticket => {:comments_attributes => {"0" => {"body" =>"NEWER comment"}} } + put :update, :id => ticket.id, + :ticket => {:comments_attributes => {"0" => {"body" =>"NEWER comment"}} } assert_not_nil assigns(:ticket).comments.last.posted_by assert_equal assigns(:ticket).comments.last.posted_by, @current_user.id get :index, {:open_status => "open"} assert assigns(:all_tickets).count > 0 - assert assigns(:all_tickets).include?(Ticket.find('stubtestticketid')) - - assert !assigns(:all_tickets).include?(Ticket.find('stubtestticketid2')) + assert assigns(:all_tickets).include?(ticket) + assert !assigns(:all_tickets).include?(other_ticket) # user should have one more ticket if a new tick gets a comment by this user assert_difference('assigns[:all_tickets].count') do - put :update, :id => 'stubtestticketid2' , :ticket => {:comments_attributes => {"0" => {"body" =>"NEWER comment"}}} + put :update, :id => other_ticket.id, :ticket => {:comments_attributes => {"0" => {"body" =>"NEWER comment"}}} get :index, {:open_status => "open"} end - assert assigns(:all_tickets).include?(Ticket.find('stubtestticketid2')) + assert assigns(:all_tickets).include?(other_ticket) # if we close one ticket, the user should have 1 less open ticket assert_difference('assigns[:all_tickets].count', -1) do - t = Ticket.find('stubtestticketid2') - t.close - t.save + other_ticket.reload + other_ticket.close + other_ticket.save get :index, {:open_status => "open"} end @@ -268,16 +264,18 @@ class TicketsControllerTest < ActionController::TestCase # look at closed tickets: get :index, {:open_status => "closed"} - assert assigns(:all_tickets).include?(Ticket.find('stubtestticketid2')) - assert !assigns(:all_tickets).include?(Ticket.find('stubtestticketid')) + assert !assigns(:all_tickets).include?(ticket) + assert assigns(:all_tickets).include?(other_ticket) number_closed_tickets = assigns(:all_tickets).count # all tickets should equal closed + open get :index, {:open_status => "all"} - assert assigns(:all_tickets).include?(Ticket.find('stubtestticketid2')) - assert assigns(:all_tickets).include?(Ticket.find('stubtestticketid')) + assert assigns(:all_tickets).include?(ticket) + assert assigns(:all_tickets).include?(other_ticket) assert_equal assigns(:all_tickets).count, number_closed_tickets + number_open_tickets + assigns(:all_tickets).each {|t| t.destroy} + end end diff --git a/help/test/unit/ticket_comment_test.rb b/help/test/unit/ticket_comment_test.rb index 1fe1fe2..44865ed 100644 --- a/help/test/unit/ticket_comment_test.rb +++ b/help/test/unit/ticket_comment_test.rb @@ -21,11 +21,11 @@ class TicketCommentTest < ActiveSupport::TestCase #comment.ticket = testticket #Ticket.find_by_title("testing") #assert_equal testticket.title, comment.ticket.title - + #tc.ticket = Ticket.find_by_title("test title") #tc.ticket.title end - + =begin test "create authenticated comment" do User.current = 4 @@ -49,6 +49,7 @@ class TicketCommentTest < ActiveSupport::TestCase testticket.comments << comment2 #this should validate comment2 testticket.valid? assert_equal testticket.comments.count, 2 + testticket.reload.destroy # where should posted_at be set? #assert_not_nil comment.posted_at #assert_not_nil testticket.comments.last.posted_at diff --git a/help/test/unit/ticket_test.rb b/help/test/unit/ticket_test.rb index ac6426e..ce35e1d 100644 --- a/help/test/unit/ticket_test.rb +++ b/help/test/unit/ticket_test.rb @@ -32,6 +32,7 @@ class TicketTest < ActiveSupport::TestCase #p t.email_address #p t.email_address.strip =~ RFC822::EmailAddress assert !t.valid? + t.reload.destroy end test "creation validated" do |