diff --git a/frontend/tests/unit/tests/work_packages/activities/revision-activity-directive-test.js b/frontend/tests/unit/tests/work_packages/activities/revision-activity-directive-test.js
new file mode 100644
index 0000000000..f148197b70
--- /dev/null
+++ b/frontend/tests/unit/tests/work_packages/activities/revision-activity-directive-test.js
@@ -0,0 +1,140 @@
+//-- copyright
+// OpenProject is a project management system.
+// Copyright (C) 2012-2015 the OpenProject Foundation (OPF)
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License version 3.
+//
+// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+// Copyright (C) 2006-2013 Jean-Philippe Lang
+// Copyright (C) 2010-2013 the ChiliProject Team
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// See doc/COPYRIGHT.rdoc for more details.
+//++
+
+/*jshint expr: true*/
+
+describe('revisionActivity Directive', function() {
+ var compile, element, rootScope, scope;
+
+ beforeEach(angular.mock.module('openproject.workPackages.activities'));
+ beforeEach(function() {
+ module(
+ 'ng-context-menu',
+ 'openproject.api',
+ 'openproject.workPackages',
+ 'openproject.models',
+ 'openproject.services',
+ 'openproject.config',
+ 'openproject.templates'
+ );
+ });
+
+ beforeEach(inject(function($rootScope, $compile) {
+ var html;
+ html = '
';
+
+ rootScope = $rootScope;
+ scope = $rootScope.$new();
+
+ compile = function() {
+ element = angular.element(html);
+ $compile(element)(scope);
+ scope.$digest();
+ };
+ }));
+
+ describe('with a valid revision', function(){
+ beforeEach(function() {
+ scope.workPackage = {
+ links: {
+ revisions: true
+ },
+ embedded: { }
+ };
+ scope.activity = {
+ links: {
+ showRevision: '/project/foo/repository/revision/1234',
+ },
+ props: {
+ 'id': 1,
+ 'identifier': '11f4b07dff4f4ce9548a52b7d002daca7cd63ec6',
+ 'formattedIdentifier': '11f4b07',
+ 'authorName': 'some developer',
+ 'message': {
+ 'format': 'plain',
+ 'raw': 'This revision provides new features\n\nAn elaborate description',
+ 'html': 'This revision provides new features
An elaborate description
'
+ },
+ 'createdAt': '2015-07-21T13:36:59Z'
+ }
+ };
+ compile();
+ });
+
+ it('should not render an image', function() {
+ expect(element.find('.avatar')).to.have.length(0);
+ });
+
+ it('should have the author name, but no link', function() {
+ expect(element.find('.user').html()).to.equal('some developer');
+ expect(element.find('.user > a')).to.have.length(0);
+ });
+
+ describe('with linked author', function() {
+ beforeEach(function() {
+ scope.activity.links.author = {
+ fetch: function() {
+ return {
+ then: function(cb) {
+ cb({
+ props: {
+ id: 1,
+ name: 'Some Dude',
+ avatar: 'avatar.png',
+ status: 'active'
+ }
+ });
+ }
+ };
+ }
+ };
+ compile();
+ });
+
+ it('should render a user profile', function() {
+ expect(element.find('.avatar').attr('alt')).to.equal('Avatar');
+ expect(element.find('span.user > a').text()).to.equal('Some Dude');
+ });
+ });
+
+ describe('message', function() {
+ it('should render commit message', function() {
+ var message = element.find('span.user-comment > span.message').html();
+
+ expect(message).to.eq(scope.activity.props.message.html);
+ });
+ });
+
+ describe('revision identifier', function() {
+ it('should render the identifier', function() {
+ expect(element.find('span.date > a').attr('title'))
+ .to.equal('11f4b07dff4f4ce9548a52b7d002daca7cd63ec6');
+ });
+ });
+ });
+});
diff --git a/frontend/tests/unit/tests/work_packages/tabs/user-activity-directive-test.js b/frontend/tests/unit/tests/work_packages/activities/user-activity-directive-test.js
similarity index 98%
rename from frontend/tests/unit/tests/work_packages/tabs/user-activity-directive-test.js
rename to frontend/tests/unit/tests/work_packages/activities/user-activity-directive-test.js
index 7524139e49..a8ff09e5d9 100644
--- a/frontend/tests/unit/tests/work_packages/tabs/user-activity-directive-test.js
+++ b/frontend/tests/unit/tests/work_packages/activities/user-activity-directive-test.js
@@ -31,7 +31,7 @@
describe('userActivity Directive', function() {
var compile, element, rootScope, scope;
- beforeEach(angular.mock.module('openproject.workPackages.tabs'));
+ beforeEach(angular.mock.module('openproject.workPackages.activities'));
beforeEach(function() {
module(
'ng-context-menu',