Add tests on Awardables and Award Emoji
This commit is contained in:
		
							parent
							
								
									4eb16290e4
								
							
						
					
					
						commit
						dccf8a9fc8
					
				|  | @ -4,21 +4,21 @@ class @AwardsHandler | |||
| 
 | ||||
|     $(document) | ||||
|       .off "click", ".js-add-award" | ||||
|       .on "click", ".js-add-award", (event) => | ||||
|         event.stopPropagation() | ||||
|         event.preventDefault() | ||||
|       .on "click", ".js-add-award", (e) => | ||||
|         e.stopPropagation() | ||||
|         e.preventDefault() | ||||
| 
 | ||||
|         @showEmojiMenu $(event.currentTarget) | ||||
|         @showEmojiMenu $(e.currentTarget) | ||||
| 
 | ||||
|     $("html").on 'click', (event) -> | ||||
|       if !$(event.target).closest(".emoji-menu").length | ||||
|     $("html").on 'click', (e) -> | ||||
|       if !$(e.target).closest(".emoji-menu").length | ||||
|         if $(".emoji-menu").is(":visible") | ||||
|           $('.js-add-award.is-active').removeClass 'is-active' | ||||
|           $(".emoji-menu").removeClass "is-visible" | ||||
| 
 | ||||
|     $(document) | ||||
|       .off "click", ".js-emoji-btn" | ||||
|       .on "click", ".js-emoji-btn", (e) => @handleClick(e) | ||||
|       .on "click", ".js-emoji-btn", @handleClick.bind(@) | ||||
| 
 | ||||
|   handleClick: (e) -> | ||||
|     e.preventDefault() | ||||
|  | @ -31,7 +31,8 @@ class @AwardsHandler | |||
|     else if $votesBlock.length is 0 | ||||
|       $votesBlock = $addAwardBtn.closest('.js-awards-block') | ||||
| 
 | ||||
|     $votesBlock.addClass 'js-awards-block-current' | ||||
|     @currentVoteBlock = $votesBlock | ||||
| 
 | ||||
|     awardUrl = $votesBlock.data 'award-url' | ||||
|     emoji = $emojiBtn | ||||
|       .find(".icon") | ||||
|  | @ -103,7 +104,6 @@ class @AwardsHandler | |||
|     emoji = @normilizeEmojiName(emoji) | ||||
|     @postEmoji awardUrl, emoji, => | ||||
|       @addAwardToEmojiBar(emoji) | ||||
|       $('.js-awards-block').removeClass 'js-awards-block-current' | ||||
| 
 | ||||
|     $(".emoji-menu").removeClass "is-visible" | ||||
| 
 | ||||
|  | @ -210,7 +210,7 @@ class @AwardsHandler | |||
|         callback.call() | ||||
| 
 | ||||
|   findEmojiIcon: (emoji) -> | ||||
|     $(".js-awards-block-current.awards > .js-emoji-btn [data-emoji='#{emoji}']") | ||||
|     @currentVoteBlock.find(".js-emoji-btn [data-emoji='#{emoji}']") | ||||
| 
 | ||||
|   scrollToAwards: -> | ||||
|     $('body, html').animate({ | ||||
|  |  | |||
|  | @ -150,7 +150,7 @@ class @Notes | |||
|   renderNote: (note) -> | ||||
|     unless note.valid | ||||
|       if note.award | ||||
|         flash = new Flash('You have already awarded this emoji, and it we\'ve removed it', 'alert') | ||||
|         flash = new Flash('You have already awarded this emoji, it has been removed', 'alert') | ||||
|         flash.pinTo('.header-content') | ||||
|       return | ||||
| 
 | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ class Projects::NotesController < Projects::ApplicationController | |||
|   def create | ||||
|     @note = Notes::CreateService.new(project, current_user, note_params).execute | ||||
| 
 | ||||
|     @note = note.is_a?(AwardEmoji) ? @note.to_note_json : note_json(@note) | ||||
|     @note = @note.is_a?(AwardEmoji) ? @note.to_note_json : note_json(@note) | ||||
| 
 | ||||
|     respond_to do |format| | ||||
|       format.json { render json: @note } | ||||
|  | @ -63,7 +63,6 @@ class Projects::NotesController < Projects::ApplicationController | |||
|   def note | ||||
|     @note ||= @project.notes.find(params[:id]) | ||||
|   end | ||||
|   alias_method :awardable, :note | ||||
| 
 | ||||
|   def note_to_html(note) | ||||
|     render_to_string( | ||||
|  |  | |||
|  | @ -131,7 +131,7 @@ module IssuesHelper | |||
|         class: "icon emoji-icon emoji-#{unicode}", | ||||
|         title: name, | ||||
|         data: data | ||||
|     else  | ||||
|     else | ||||
|       # Emoji icons displayed separately, used for the awards already given | ||||
|       # to an issue or merge request. | ||||
|       content_tag :img, "", | ||||
|  | @ -145,12 +145,9 @@ module IssuesHelper | |||
|   end | ||||
| 
 | ||||
|   def award_user_list(awards, current_user) | ||||
|     list =  | ||||
|       awards.map do |award| | ||||
|         award.user == current_user ? "me" : award.user.name | ||||
|       end | ||||
| 
 | ||||
|     list.join(", ") | ||||
|     awards.map do |award| | ||||
|       award.user == current_user ? 'me' : award.user.name | ||||
|     end.join(', ') | ||||
|   end | ||||
| 
 | ||||
|   def award_active_class(awards, current_user) | ||||
|  |  | |||
|  | @ -36,7 +36,6 @@ class MergeRequest < ActiveRecord::Base | |||
|   include Referable | ||||
|   include Sortable | ||||
|   include Taskable | ||||
|   include Awardable | ||||
| 
 | ||||
|   belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project" | ||||
|   belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project" | ||||
|  |  | |||
							
								
								
									
										19
									
								
								db/schema.rb
								
								
								
								
							
							
						
						
									
										19
									
								
								db/schema.rb
								
								
								
								
							|  | @ -11,7 +11,7 @@ | |||
| # | ||||
| # It's strongly recommended that you check this file into your version control system. | ||||
| 
 | ||||
| ActiveRecord::Schema.define(version: 20160416190505) do | ||||
| ActiveRecord::Schema.define(version: 20160421130527) do | ||||
| 
 | ||||
|   # These are extensions that must be enabled in order to support this database | ||||
|   enable_extension "plpgsql" | ||||
|  | @ -77,7 +77,9 @@ ActiveRecord::Schema.define(version: 20160416190505) do | |||
|     t.string   "akismet_api_key" | ||||
|     t.boolean  "email_author_in_body",              default: false | ||||
|     t.integer  "default_group_visibility" | ||||
|     t.boolean  "repository_checks_enabled",         default: true | ||||
|     t.boolean  "repository_checks_enabled",         default: false | ||||
|     t.integer  "metrics_packet_size",               default: 1 | ||||
|     t.text     "shared_runners_text" | ||||
|   end | ||||
| 
 | ||||
|   create_table "audit_events", force: :cascade do |t| | ||||
|  | @ -182,14 +184,21 @@ ActiveRecord::Schema.define(version: 20160416190505) do | |||
|     t.text     "yaml_errors" | ||||
|     t.datetime "committed_at" | ||||
|     t.integer  "gl_project_id" | ||||
|     t.string   "status" | ||||
|     t.datetime "started_at" | ||||
|     t.datetime "finished_at" | ||||
|     t.integer  "duration" | ||||
|   end | ||||
| 
 | ||||
|   add_index "ci_commits", ["gl_project_id", "sha"], name: "index_ci_commits_on_gl_project_id_and_sha", using: :btree | ||||
|   add_index "ci_commits", ["gl_project_id", "status"], name: "index_ci_commits_on_gl_project_id_and_status", using: :btree | ||||
|   add_index "ci_commits", ["gl_project_id"], name: "index_ci_commits_on_gl_project_id", using: :btree | ||||
|   add_index "ci_commits", ["project_id", "committed_at", "id"], name: "index_ci_commits_on_project_id_and_committed_at_and_id", using: :btree | ||||
|   add_index "ci_commits", ["project_id", "committed_at"], name: "index_ci_commits_on_project_id_and_committed_at", using: :btree | ||||
|   add_index "ci_commits", ["project_id", "sha"], name: "index_ci_commits_on_project_id_and_sha", using: :btree | ||||
|   add_index "ci_commits", ["project_id"], name: "index_ci_commits_on_project_id", using: :btree | ||||
|   add_index "ci_commits", ["sha"], name: "index_ci_commits_on_sha", using: :btree | ||||
|   add_index "ci_commits", ["status"], name: "index_ci_commits_on_status", using: :btree | ||||
| 
 | ||||
|   create_table "ci_events", force: :cascade do |t| | ||||
|     t.integer  "project_id" | ||||
|  | @ -433,6 +442,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do | |||
|     t.integer  "moved_to_id" | ||||
|     t.boolean  "confidential",  default: false | ||||
|     t.datetime "deleted_at" | ||||
|     t.date     "due_date" | ||||
|   end | ||||
| 
 | ||||
|   add_index "issues", ["assignee_id"], name: "index_issues_on_assignee_id", using: :btree | ||||
|  | @ -442,6 +452,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do | |||
|   add_index "issues", ["created_at"], name: "index_issues_on_created_at", using: :btree | ||||
|   add_index "issues", ["deleted_at"], name: "index_issues_on_deleted_at", using: :btree | ||||
|   add_index "issues", ["description"], name: "index_issues_on_description_trigram", using: :gin, opclasses: {"description"=>"gin_trgm_ops"} | ||||
|   add_index "issues", ["due_date"], name: "index_issues_on_due_date", using: :btree | ||||
|   add_index "issues", ["milestone_id"], name: "index_issues_on_milestone_id", using: :btree | ||||
|   add_index "issues", ["project_id", "iid"], name: "index_issues_on_project_id_and_iid", unique: true, using: :btree | ||||
|   add_index "issues", ["project_id"], name: "index_issues_on_project_id", using: :btree | ||||
|  | @ -635,12 +646,14 @@ ActiveRecord::Schema.define(version: 20160416190505) do | |||
|     t.boolean  "system",        default: false, null: false | ||||
|     t.text     "st_diff" | ||||
|     t.integer  "updated_by_id" | ||||
|     t.boolean  "is_award",      default: false, null: false | ||||
|   end | ||||
| 
 | ||||
|   add_index "notes", ["author_id"], name: "index_notes_on_author_id", using: :btree | ||||
|   add_index "notes", ["commit_id"], name: "index_notes_on_commit_id", using: :btree | ||||
|   add_index "notes", ["created_at", "id"], name: "index_notes_on_created_at_and_id", using: :btree | ||||
|   add_index "notes", ["created_at"], name: "index_notes_on_created_at", using: :btree | ||||
|   add_index "notes", ["is_award"], name: "index_notes_on_is_award", using: :btree | ||||
|   add_index "notes", ["line_code"], name: "index_notes_on_line_code", using: :btree | ||||
|   add_index "notes", ["note"], name: "index_notes_on_note_trigram", using: :gin, opclasses: {"note"=>"gin_trgm_ops"} | ||||
|   add_index "notes", ["noteable_id", "noteable_type"], name: "index_notes_on_noteable_id_and_noteable_type", using: :btree | ||||
|  | @ -829,6 +842,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do | |||
|     t.boolean  "build_events",          default: false,    null: false | ||||
|     t.string   "category",              default: "common", null: false | ||||
|     t.boolean  "default",               default: false | ||||
|     t.boolean  "wiki_page_events",      default: true | ||||
|   end | ||||
| 
 | ||||
|   add_index "services", ["category"], name: "index_services_on_category", using: :btree | ||||
|  | @ -1023,6 +1037,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do | |||
|     t.boolean  "note_events",                          default: false,         null: false | ||||
|     t.boolean  "enable_ssl_verification",              default: true | ||||
|     t.boolean  "build_events",                         default: false,         null: false | ||||
|     t.boolean  "wiki_page_events",                     default: false,         null: false | ||||
|   end | ||||
| 
 | ||||
|   add_index "web_hooks", ["created_at", "id"], name: "index_web_hooks_on_created_at_and_id", using: :btree | ||||
|  |  | |||
|  | @ -191,15 +191,15 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps | |||
|   end | ||||
| 
 | ||||
|   step 'issue "Release 0.4" have 2 upvotes and 1 downvote' do | ||||
|     issue = Issue.find_by(title: 'Release 0.4') | ||||
|     create_list(:upvote_note, 2, project: project, noteable: issue) | ||||
|     create(:downvote_note, project: project, noteable: issue) | ||||
|     awardable = Issue.find_by(title: 'Release 0.4') | ||||
|     create_list(:upvote, 2, project: project, awardable: awardable) | ||||
|     create(:downvote, project: project, awardable: awardable) | ||||
|   end | ||||
| 
 | ||||
|   step 'issue "Tweet control" have 1 upvote and 2 downvotes' do | ||||
|     issue = Issue.find_by(title: 'Tweet control') | ||||
|     create(:upvote_note, project: project, noteable: issue) | ||||
|     create_list(:downvote_note, 2, project: project, noteable: issue) | ||||
|     create(:upvote, project: project, noteable: issue) | ||||
|     create_list(:downvote, 2, project: project, noteable: issue) | ||||
|   end | ||||
| 
 | ||||
|   step 'The list should be sorted by "Least popular"' do | ||||
|  |  | |||
|  | @ -179,14 +179,14 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps | |||
| 
 | ||||
|   step 'merge request "Bug NS-04" have 2 upvotes and 1 downvote' do | ||||
|     merge_request = MergeRequest.find_by(title: 'Bug NS-04') | ||||
|     create_list(:upvote_note, 2, project: project, noteable: merge_request) | ||||
|     create(:downvote_note, project: project, noteable: merge_request) | ||||
|     create_list(:upvote, 2, project: project, awardable: merge_request) | ||||
|     create(:downvote, project: project, awardable: merge_request) | ||||
|   end | ||||
| 
 | ||||
|   step 'merge request "Bug NS-06" have 1 upvote and 2 downvotes' do | ||||
|     merge_request = MergeRequest.find_by(title: 'Bug NS-06') | ||||
|     create(:upvote_note, project: project, noteable: merge_request) | ||||
|     create_list(:downvote_note, 2, project: project, noteable: merge_request) | ||||
|     awardable = MergeRequest.find_by(title: 'Bug NS-06') | ||||
|     create(:upvote, project: project, awardable: awardable) | ||||
|     create_list(:downvote, 2, project: project, awardable: awardable) | ||||
|   end | ||||
| 
 | ||||
|   step 'The list should be sorted by "Least popular"' do | ||||
|  |  | |||
|  | @ -211,4 +211,18 @@ describe Projects::IssuesController do | |||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'POST #toggle_award_emoji' do | ||||
|     before do | ||||
|       sign_in(user) | ||||
|       project.team << [user, :developer] | ||||
|     end | ||||
| 
 | ||||
|     it "yields status code 200" do | ||||
|       post(:toggle_award_emoji, namespace_id: project.namespace.path, | ||||
|                                 project_id: project.path, id: issue.iid, name: "thumbsup") | ||||
| 
 | ||||
|       expect(response.status).to eq(200) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -3,5 +3,16 @@ FactoryGirl.define do | |||
|     name "thumbsup" | ||||
|     user | ||||
|     awardable factory: :issue | ||||
| 
 | ||||
|     trait :thumbs_up | ||||
|     trait :upvote | ||||
| 
 | ||||
|     trait :thumbs_down do | ||||
|       name "thumbsdown" | ||||
|     end | ||||
| 
 | ||||
|     trait :downvote do | ||||
|       name "thumbsdown" | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -67,7 +67,7 @@ describe 'Issues', feature: true do | |||
|   describe 'Issue info' do | ||||
|     it 'excludes award_emoji from comment count' do | ||||
|       issue = create(:issue, author: @user, assignee: @user, project: project, title: 'foobar') | ||||
|       create(:upvote_note, noteable: issue) | ||||
|       create(:award_emoji, awardable: issue) | ||||
| 
 | ||||
|       visit namespace_project_issues_path(project.namespace, project, assignee_id: @user.id) | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ describe 'Comments', feature: true do | |||
|     it 'excludes award_emoji from comment count' do | ||||
|       merge_request = create(:merge_request) | ||||
|       project = merge_request.source_project | ||||
|       create(:upvote_note, noteable: merge_request, project: project) | ||||
|       create(:award_emoji, awardable: merge_request, project: project) | ||||
| 
 | ||||
|       login_as :admin | ||||
|       visit namespace_project_merge_requests_path(project.namespace, project) | ||||
|  | @ -146,7 +146,7 @@ describe 'Comments', feature: true do | |||
| 
 | ||||
|     describe 'comment info' do | ||||
|       it 'excludes award_emoji from comment count' do | ||||
|         create(:upvote_note, noteable: merge_request, project: project) | ||||
|         create(:award_emoji, awardable: merge_request, project: project) | ||||
| 
 | ||||
|         visit namespace_project_merge_request_path(project.namespace, project, merge_request) | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,49 @@ | |||
| require 'spec_helper' | ||||
| 
 | ||||
| describe Issue, "Awardable" do | ||||
|   let!(:issue)        { create(:issue) } | ||||
|   let!(:award_emoji)  { create(:award_emoji, :downvote, awardable: issue) } | ||||
| 
 | ||||
|   describe "Associations" do | ||||
|     it { is_expected.to have_many(:award_emoji).dependent(:destroy) } | ||||
|   end | ||||
| 
 | ||||
|   describe "ClassMethods" do | ||||
|     let!(:issue2) { create(:issue) } | ||||
| 
 | ||||
|     before do | ||||
|       create(:award_emoji, awardable: issue2) | ||||
|     end | ||||
| 
 | ||||
|     it "orders on upvotes" do | ||||
|       expect(Issue.order_upvotes_desc.to_a).to eq [issue2, issue] | ||||
|     end | ||||
| 
 | ||||
|     it "orders on downvotes" do | ||||
|       expect(Issue.order_downvotes_desc.to_a).to eq [issue, issue2] | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe "#upvotes" do | ||||
|     it "counts the number of upvotes" do | ||||
|       expect(issue.upvotes).to be 0 | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe "#downvotes" do | ||||
|     it "counts the number of downvotes" do | ||||
|       expect(issue.downvotes).to be 1 | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe "#toggle_award_emoji" do | ||||
|     it "adds an emoji if it isn't awarded yet" do | ||||
|       expect { issue.toggle_award_emoji("thumbsup", award_emoji.user) }.to change { AwardEmoji.count }.by 1 | ||||
|     end | ||||
| 
 | ||||
|     it "toggles already awarded emoji" do | ||||
| 
 | ||||
|       expect { issue.toggle_award_emoji("thumbsdown", award_emoji.user) }.to change { AwardEmoji.count }.by -1 | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | @ -12,6 +12,10 @@ describe Issue, "Issuable" do | |||
|     it { is_expected.to have_many(:todos).dependent(:destroy) } | ||||
|   end | ||||
| 
 | ||||
|   describe 'Included modules' do | ||||
|     it { is_expected.to include_module(Awardable) } | ||||
|   end | ||||
| 
 | ||||
|   describe "Validation" do | ||||
|     before do | ||||
|       allow(subject).to receive(:set_iid).and_return(false) | ||||
|  |  | |||
|  | @ -93,6 +93,7 @@ describe User, models: true do | |||
|     it { is_expected.to have_one(:abuse_report) } | ||||
|     it { is_expected.to have_many(:spam_logs).dependent(:destroy) } | ||||
|     it { is_expected.to have_many(:todos).dependent(:destroy) } | ||||
|     it { is_expected.to have_many(:award_emoji).dependent(:destroy) } | ||||
|   end | ||||
| 
 | ||||
|   describe 'validations' do | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ describe Notes::CreateService, services: true do | |||
|           noteable_type: 'Issue', | ||||
|           noteable_id: issue.id | ||||
|         } | ||||
|          | ||||
| 
 | ||||
|         @note = Notes::CreateService.new(project, user, opts).execute | ||||
|       end | ||||
| 
 | ||||
|  | @ -28,18 +28,16 @@ describe Notes::CreateService, services: true do | |||
|       project.team << [user, :master] | ||||
|     end | ||||
| 
 | ||||
|     it "creates emoji note" do | ||||
|     it "creates an award emoji" do | ||||
|       opts = { | ||||
|         note: ':smile: ', | ||||
|         noteable_type: 'Issue', | ||||
|         noteable_id: issue.id | ||||
|       } | ||||
|       note = Notes::CreateService.new(project, user, opts).execute | ||||
| 
 | ||||
|       @note = Notes::CreateService.new(project, user, opts).execute | ||||
| 
 | ||||
|       expect(@note).to be_valid | ||||
|       expect(@note.note).to eq('smile') | ||||
|       expect(@note.is_award).to be_truthy | ||||
|       expect(note).to be_valid | ||||
|       expect(note.name).to eq('smile') | ||||
|     end | ||||
| 
 | ||||
|     it "creates regular note if emoji name is invalid" do | ||||
|  | @ -48,12 +46,10 @@ describe Notes::CreateService, services: true do | |||
|         noteable_type: 'Issue', | ||||
|         noteable_id: issue.id | ||||
|       } | ||||
|       note = Notes::CreateService.new(project, user, opts).execute | ||||
| 
 | ||||
|       @note = Notes::CreateService.new(project, user, opts).execute | ||||
| 
 | ||||
|       expect(@note).to be_valid | ||||
|       expect(@note.note).to eq(opts[:note]) | ||||
|       expect(@note.is_award).to be_falsy | ||||
|       expect(note).to be_valid | ||||
|       expect(note.note).to eq(opts[:note]) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -137,7 +137,6 @@ describe TodoService, services: true do | |||
|       let(:note_on_commit) { create(:note_on_commit, project: project, author: john_doe, note: mentions) } | ||||
|       let(:note_on_confidential_issue) { create(:note_on_issue, noteable: confidential_issue, project: project, note: mentions) } | ||||
|       let(:note_on_project_snippet) { create(:note_on_project_snippet, project: project, author: john_doe, note: mentions) } | ||||
|       let(:award_note) { create(:note, :award, project: project, noteable: issue, author: john_doe, note: 'thumbsup') } | ||||
|       let(:system_note) { create(:system_note, project: project, noteable: issue) } | ||||
| 
 | ||||
|       it 'mark related pending todos to the noteable for the note author as done' do | ||||
|  | @ -150,13 +149,6 @@ describe TodoService, services: true do | |||
|         expect(second_todo.reload).to be_done | ||||
|       end | ||||
| 
 | ||||
|       it 'mark related pending todos to the noteable for the award note author as done' do | ||||
|         service.new_note(award_note, john_doe) | ||||
| 
 | ||||
|         expect(first_todo.reload).to be_done | ||||
|         expect(second_todo.reload).to be_done | ||||
|       end | ||||
| 
 | ||||
|       it 'does not mark related pending todos it is a system note' do | ||||
|         service.new_note(system_note, john_doe) | ||||
| 
 | ||||
|  | @ -286,6 +278,15 @@ describe TodoService, services: true do | |||
|         expect(second_todo.reload).to be_done | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     describe '#new_award_emoji' do | ||||
|       it 'marks related pending todos to the target for the user as done' do | ||||
|         todo = create(:todo, user: john_doe, project: project, target: mr_assigned, author: author) | ||||
|         service.new_award_emoji(mr_assigned, john_doe) | ||||
| 
 | ||||
|         expect(todo.reload).to be_done | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def should_create_todo(attributes = {}) | ||||
|  |  | |||
|  | @ -0,0 +1,39 @@ | |||
| require 'spec_helper' | ||||
| 
 | ||||
| describe ToggleAwardEmoji, services: true do | ||||
|   let(:project) { create(:project) } | ||||
|   let(:user)    { create(:user) } | ||||
|   let(:issue)   { create(:issue, project: project) } | ||||
| 
 | ||||
|   before do | ||||
|     project.team << [user, :master] | ||||
|   end | ||||
| 
 | ||||
|   describe '#execute' do | ||||
|     it 'removes related todos' do | ||||
|       expect_any_instance_of(TodoService).to receive(:new_award_emoji).with(issue, user) | ||||
| 
 | ||||
|       ToggleAwardEmojiService.new(project, user).execute(issue, "thumbsdown") | ||||
|     end | ||||
| 
 | ||||
|     it 'normalizes the emoji name' do | ||||
|       expect(issue).to receive(:toggle_award_emoji).with("thumbsup", user) | ||||
| 
 | ||||
|       ToggleAwardEmojiService.new(project, user).execute(issue, ":+1:") | ||||
|     end | ||||
| 
 | ||||
|     context 'when the emoji is set' do | ||||
|       it 'removes the emoji' do | ||||
|         create(:award_emoji, awardable: issue, user: user) | ||||
| 
 | ||||
|         expect { ToggleAwardEmojiService.new(project, user).execute(issue, ":+1:") }.to change { AwardEmoji.count }.by(-1) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'when the award is not set yet' do | ||||
|       it 'awards the emoji' do | ||||
|         expect { ToggleAwardEmojiService.new(project, user).execute(issue, ":+1:") }.to change { AwardEmoji.count }.by(1) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
		Loading…
	
		Reference in New Issue