# encoding: utf-8
#--
# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#++
require File.dirname(__FILE__) + '/../../../test_helper'
class TextEventRenderingTest < ActiveSupport::TestCase
def setup
@event = Event.new({
:target => repositories(:johans),
:body => 'blabla',
:project => repositories(:johans).project,
:action => Action::PUSH,
:user => users(:johan)
})
end
context "in general" do
should "Have a render(event) api" do
assert EventRendering::Text.respond_to?(:render)
render_mock = mock
EventRendering::Text.expects(:new).with(@event).returns(render_mock)
render_mock.expects(:render)
EventRendering::Text.render(@event)
end
should "always include a project link" do
res = render(@event)
assert_match /\nhttp:\/\/gitorious\.test\/johans-project$/, res
end
should "raise error for unknown actions" do
@event.action = 666
assert_raises(EventRendering::UnknownActionError) do
render(@event)
end
end
end
context "from a string template" do
setup { @renderer = EventRendering::Text.new(@event) }
should "replace a single key" do
res = @renderer.template_to_str("foo {what} baz", :what => "bar")
assert_equal "foo bar baz", res
end
should "replace multiple occurances" do
res = @renderer.template_to_str("foo {what} {what}", :what => "bar")
assert_equal "foo bar bar", res
end
should "replace multiple values" do
res = @renderer.template_to_str("{a}-{b} {c}!", {
:a => "foo",
:b => "bar",
:c => "baz"
})
assert_equal "foo-bar baz!", res
end
end
context "clone repository event" do
setup do
@event.action = Action::CLONE_REPOSITORY
@clone_repo = @event.target.clones.first
assert_not_nil @clone_repo
@event.target = @clone_repo
@event.data = repositories(:johans).id
@output = render(@event)
end
should "render the username who cloned it" do
assert @output.include?("#{@clone_repo.user.login} cloned"), @output
end
should "include the name of the source repository" do
assert_match /#{repositories(:johans).url_path}/, @output
end
should "render the url of the clone" do
exp = " http://#{GitoriousConfig['gitorious_host']}/#{@clone_repo.url_path}"
assert @output.include?(exp), "didn't include the url in: #{@output}"
end
end
context "delete repo" do
setup do
@event.action = Action::DELETE_REPOSITORY
@event.target = users(:johan)
@event.data = "old-repo-name"
end
should "render a repo deletion event" do
assert_match /^johan deleted repository old-repo-name/, render(@event)
end
end
context "creating and deleting branches" do
setup do
@event.data = "branch-name"
end
should "render creation of branch" do
@event.action = Action::CREATE_BRANCH
res = render(@event)
assert_match /^johan created branch branch-name in /, res
end
should "render deletion of branch" do
@event.action = Action::DELETE_BRANCH
res = render(@event)
assert_match /^johan deleted branch branch-name in /, res
end
end
context "Merge request updates" do
setup do
@event.target = merge_requests(:moes_to_johans)
end
should "render creation of merge request" do
@event.action = Action::REQUEST_MERGE
result = render(@event)
assert_match /^johan requested a merge of johansprojectrepos-clone with johansprojectrepos/, result
end
should "render deletion of merge requests" do
@event.action = Action::DELETE_MERGE_REQUEST
result = render(@event)
assert_match /^johan deleted merge request for johansprojectrepos-clone with johansprojectrepos/, result
end
end
context "creating and deleting tags" do
setup do
@event.data = "v1.0"
end
should "render creation of branch" do
@event.action = Action::CREATE_TAG
res = render(@event)
assert_match /^johan created tag v1.0 in /, res
end
should "render deletion of branch" do
@event.action = Action::DELETE_TAG
res = render(@event)
assert_match /^johan deleted tag v1.0 in /, res
end
should "include the tag message" do
@event.action = Action::CREATE_TAG
@event.body = "Tagged 1.0"
res = render(@event)
assert_match /Tagged 1\.0/, res
end
end
context "Adding and removing collaborators" do
setup do
@event.data = "bob-the-user"
end
should "render creation of branch" do
@event.action = Action::ADD_COMMITTER
res = render(@event)
assert_match /^johan added bob-the-user as collaborator to /, res
end
should "render deletion of branch" do
@event.action = Action::REMOVE_COMMITTER
res = render(@event)
assert_match /^johan removed bob-the-user as collaborator from /, res
end
should "include the repo url" do
@event.action = Action::ADD_COMMITTER
res = render(@event)
assert res.include?("gitorious.test/#{@event.target.url_path}"), "url not in: #{res}"
end
end
context "a comment" do
setup do
@comment = Comment.last
@comment.update_attribute(:sha1, "abc123")
@event.action = Action::COMMENT
@event.body = "MergeRequest"
@event.data = @comment.id
@merge_request = MergeRequest.last
@event.target = @merge_request
end
should "render the user and comment body" do
res = render(@event)
assert_match(/^johan commented on/, res)
assert res.include?(@comment.body), "comment body not in #{res.inspect}"
end
should "include a link back to the merge request" do
res = render(@event)
url = "/#{@merge_request.target_repository.url_path}/"
url << "merge_requests/#{@merge_request.to_param}"
assert res.include?("gitorious.test#{url}"), "#{url} not in: #{res}"
end
should "include a link back to the commit" do
@event.target = repositories(:johans)
@event.body = "Repository"
url = "/#{@merge_request.target_repository.url_path}/commit/#{@comment.sha1}"
res = render(@event)
assert res.include?("gitorious.test#{url}"), "#{url} not in: #{res}"
end
end
context "a push" do
setup do
@event.action = Action::PUSH
@event.body = "master changed from abc213 to 123abc"
@event.data = "master"
@event.target = repositories(:johans)
end
should "include the ref change" do
res = render(@event)
assert res.include?("master changed from abc213 to 123abc")
end
should "include the number of commits pushed" do
10.times do |i|
@event.build_commit({
:email => 'John Schmidt ',
:data => 'acb123#{i}',
:body => 'Added foo.#{i}'
}).save!
end
assert_match("johan pushed 10 commits to master", render(@event))
end
should "include a list of the commits messages along with an url for each" do
commit1 = @event.build_commit({:email => 'John Schmidt ',
:data => 'acb123abc123', :body => 'Added foo'})
commit2 = @event.build_commit({:email => 'Jane Schmidt ',
:data => '321abc321abc', :body => 'added bar'})
[commit1, commit2].each(&:save)
assert @event.reload.has_commits?
res = render(@event)
assert res.include?("John Schmidt committed acb123:\n"), "name not in #{res.inspect}"
assert res.include?(commit1.body), "msg not in #{res}"
assert res.include?("gitorious.test/#{@event.target.url_path}/commit/#{commit1.data}")
assert res.include?("Jane Schmidt committed 321abc:\n"), "name not in #{res}"
assert res.include?(commit2.body), "msg not in #{res}"
assert res.include?("gitorious.test/#{@event.target.url_path}/commit/#{commit2.data}")
end
end
context "A project" do
setup { @event.target = projects(:johans) }
context "creation" do
setup { @event.action = Action::CREATE_PROJECT }
should "include the creator and project name" do
res = render(@event)
assert_match(/^johan created project #{@event.target.title}/, res)
assert res.include?(projects(:johans).description), "desc. not in #{res}"
end
should "include the project description" do
res = render(@event)
assert res.include?(projects(:johans).description), "desc. not in #{res}"
end
end
context "updating" do
setup { @event.action = Action::UPDATE_PROJECT }
should "include the updator and project name" do
assert_match(/^johan updated project #{projects(:johans).title}/, render(@event))
end
end
end
context "wiki page" do
setup do
@event.action = Action::UPDATE_WIKI_PAGE
@event.data = "AWikiPage"
@event.target = projects(:johans)
end
should "include the user and page name" do
assert_match(/^johan updated wiki page AWikiPage/, render(@event))
end
should "include a link to the wiki page" do
res = render(@event)
url = "gitorious.test/#{@event.target.slug}/pages/AWikiPage"
assert res.include?(url), "no link in: #{res}"
end
end
context "Adding a project repo" do
setup do
@event.action = Action::ADD_PROJECT_REPOSITORY
@event.target = repositories(:johans)
end
should "render the user and repo name" do
assert_match(/^johan added a repository to #{@event.target.project.title}/,
render(@event))
end
should "include a link to the repo" do
res = render(@event)
url = "gitorious.test/#{@event.target.url_path}"
assert res.include?(url), "repo url not in: #{res}"
end
should "include the repo description, if present" do
@event.target.update_attribute(:description, "moooooo")
res = render(@event)
assert res.include?(@event.target.description + "\n"), "repo descr. not in: #{res}"
end
end
context "updating a repository" do
setup do
@event.action = Action::UPDATE_REPOSITORY
@event.body = "Changed the repository description"
@event.target = repositories(:johans)
end
should "render the username and repo name" do
res = render(@event)
assert_match(/^johan updated #{@event.target.url_path}/, res)
assert res.include?(@event.body), "event body not in: #{res}"
end
end
context "favoriting" do
setup do
@event.action = Action::ADD_FAVORITE
@event.target = users(:mike)
@repo = repositories(:johans)
@event.body = @repo.class.name
@event.data = @repo.id
end
should "include the username and watchable" do
assert_match(/^johan favorited #{@repo.url_path}/, render(@event))
end
should "include a link to the watchable" do
res = render(@event)
url = "gitorious.test/#{@repo.url_path}"
assert res.include?(url), "link not in: #{res}"
end
should "include the merge request sequence number" do
mr = MergeRequest.last
@event.body = mr.class.name
@event.data = mr.id
assert_match(/^johan favorited merge request ##{mr.sequence_number}/,
render(@event))
end
end
protected
def render(event)
::EventRendering::Text.render(event)
end
end