You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by mf...@apache.org on 2012/12/28 22:27:53 UTC

svn commit: r1426640 - in /rave/branches/mongo/rave-components/rave-mongodb/src: main/java/org/apache/rave/portal/model/conversion/impl/ main/java/org/apache/rave/portal/repository/ main/java/org/apache/rave/portal/repository/impl/ main/java/org/apache...

Author: mfranklin
Date: Fri Dec 28 21:27:52 2012
New Revision: 1426640

URL: http://svn.apache.org/viewvc?rev=1426640&view=rev
Log:
Updated tests for tag repository

Added:
    rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/conversion/impl/TagImplConverter.java
    rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/MongoTagOperations.java
    rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoTagTemplate.java
Modified:
    rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbTagRepository.java
    rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbWidgetRepository.java
    rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/util/CollectionNames.java
    rave/branches/mongo/rave-components/rave-mongodb/src/test/java/org/apache/rave/portal/repository/impl/MongoDbTagRepositoryTest.java

Added: rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/conversion/impl/TagImplConverter.java
URL: http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/conversion/impl/TagImplConverter.java?rev=1426640&view=auto
==============================================================================
--- rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/conversion/impl/TagImplConverter.java (added)
+++ rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/conversion/impl/TagImplConverter.java Fri Dec 28 21:27:52 2012
@@ -0,0 +1,22 @@
+package org.apache.rave.portal.model.conversion.impl;
+
+import org.apache.rave.portal.model.Tag;
+import org.apache.rave.portal.model.conversion.HydratingModelConverter;
+import org.apache.rave.portal.model.impl.TagImpl;
+
+public class TagImplConverter implements HydratingModelConverter<Tag, TagImpl> {
+    @Override
+    public void hydrate(TagImpl dehydrated) {
+        //NOP
+    }
+
+    @Override
+    public Class<Tag> getSourceType() {
+        return Tag.class;
+    }
+
+    @Override
+    public TagImpl convert(Tag tag) {
+        return new TagImpl(tag.getId(), tag.getKeyword());
+    }
+}

Added: rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/MongoTagOperations.java
URL: http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/MongoTagOperations.java?rev=1426640&view=auto
==============================================================================
--- rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/MongoTagOperations.java (added)
+++ rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/MongoTagOperations.java Fri Dec 28 21:27:52 2012
@@ -0,0 +1,9 @@
+package org.apache.rave.portal.repository;
+
+import org.apache.rave.portal.model.Tag;
+
+/**
+ * Provides Mongo Model Template operations for Tags
+ */
+public interface MongoTagOperations extends MongoModelOperations<Tag> {
+}

Modified: rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbTagRepository.java
URL: http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbTagRepository.java?rev=1426640&r1=1426639&r2=1426640&view=diff
==============================================================================
--- rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbTagRepository.java (original)
+++ rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbTagRepository.java Fri Dec 28 21:27:52 2012
@@ -20,14 +20,9 @@
 package org.apache.rave.portal.repository.impl;
 
 
-import com.google.common.collect.Lists;
-import org.apache.commons.collections.ListUtils;
-import org.apache.rave.exception.NotSupportedException;
 import org.apache.rave.portal.model.Tag;
-import org.apache.rave.portal.model.Widget;
-import org.apache.rave.portal.model.WidgetTag;
 import org.apache.rave.portal.model.impl.TagImpl;
-import org.apache.rave.portal.repository.MongoWidgetOperations;
+import org.apache.rave.portal.repository.MongoTagOperations;
 import org.apache.rave.portal.repository.TagRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.query.Query;
@@ -35,84 +30,51 @@ import org.springframework.stereotype.Re
 
 import java.util.List;
 
+import static org.springframework.data.mongodb.core.query.Criteria.where;
+import static org.springframework.data.mongodb.core.query.Query.query;
+
 @Repository
 public class MongoDbTagRepository implements TagRepository {
 
     @Autowired
-    private MongoWidgetOperations widgetTemplate;
+    private MongoTagOperations template;
 
     @Override
     public List<Tag> getAll() {
-        List<Widget> widgets = widgetTemplate.find(new Query());
-        List<Tag> tags = Lists.newArrayList();
-        for (Widget widget : widgets) {
-            addUniqueTags(tags, widget);
-        }
-        return tags;
+        return template.find(new Query());
     }
 
     @Override
     public int getCountAll() {
-        return getAll().size();
+        return (int)template.count(new Query());
     }
 
     @Override
     public Tag getByKeyword(String keyword) {
-        return new TagImpl(keyword);
-    }
-
-    //@Override
-    @SuppressWarnings("unchecked")
-    public List<Tag> getAvailableTagsByWidgetId(String widgetId) {
-        List<Tag> all = getAll();
-        List<Tag> widgetTags = getTagsFromWidget(widgetTemplate.get(widgetId).getTags());
-        return ListUtils.subtract(all, widgetTags);
+        return template.findOne(query(where("keyword").is(keyword)));
     }
 
     @Override
     public Class<? extends Tag> getType() {
-        return Tag.class;
+        return TagImpl.class;
     }
 
     @Override
     public Tag get(String id) {
-        throw new NotSupportedException("Cannot access tags by Id");
+        return template.get(id);
     }
 
     @Override
     public Tag save(Tag item) {
-        throw new NotSupportedException("Cannot save tags directly");
+        return template.count(query(where("keyword").is(item.getKeyword()))) == 0 ? template.save(item) : item;
     }
 
     @Override
     public void delete(Tag item) {
-        throw new NotSupportedException("Cannot delete tags directly");
-    }
-
-    private List<Tag> getTagsFromWidget(List<WidgetTag> widgetTags) {
-        List<Tag> tags = Lists.newArrayList();
-        if (widgetTags != null) {
-            for (WidgetTag widgetTag : widgetTags) {
-                tags.add(get(widgetTag.getTagId()));
-            }
-        }
-        return tags;
-    }
-
-
-    private void addUniqueTags(List<Tag> tags, Widget widget) {
-        //returns if there are no tags for this widget to prevent null pointer exception
-        if (widget.getTags() == null) return;
-
-        for (WidgetTag widgetTag : widget.getTags()) {
-            Tag tag = get(widgetTag.getTagId());
-            if (!tags.contains(tag)) {
-                tags.add(tag);
-            }
-        }
+        template.remove(query(where("_id").is(item.getId())));
     }
 
-    public void setWidgetTemplate(MongoWidgetOperations widgetTemplate) {
-        this.widgetTemplate = widgetTemplate;
+    public void setWidgetTemplate(MongoTagOperations tagTemplate) {
+        this.template = tagTemplate;
     }
 }

Modified: rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbWidgetRepository.java
URL: http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbWidgetRepository.java?rev=1426640&r1=1426639&r2=1426640&view=diff
==============================================================================
--- rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbWidgetRepository.java (original)
+++ rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbWidgetRepository.java Fri Dec 28 21:27:52 2012
@@ -23,6 +23,7 @@ import com.google.common.collect.Maps;
 import org.apache.rave.exception.NotSupportedException;
 import org.apache.rave.portal.model.*;
 import org.apache.rave.portal.model.util.WidgetStatistics;
+import org.apache.rave.portal.repository.MongoTagOperations;
 import org.apache.rave.portal.repository.MongoWidgetOperations;
 import org.apache.rave.portal.repository.StatisticsAggregator;
 import org.apache.rave.portal.repository.WidgetRepository;
@@ -52,6 +53,9 @@ public class MongoDbWidgetRepository imp
     private MongoWidgetOperations template;
 
     @Autowired
+    private MongoTagOperations tagTemplate;
+
+    @Autowired
     private StatisticsAggregator statsAggregator;
 
     @Override
@@ -119,7 +123,7 @@ public class MongoDbWidgetRepository imp
     }
 
     @Override
-    public WidgetStatistics getWidgetStatistics(String  widget_id, String  user_id) {
+    public WidgetStatistics getWidgetStatistics(String widget_id, String user_id) {
         return statsAggregator.getWidgetStatistics(widget_id, user_id);
     }
 
@@ -129,10 +133,10 @@ public class MongoDbWidgetRepository imp
     }
 
     @Override
-    public Map<String , WidgetRating> getUsersWidgetRatings(String userId) {
+    public Map<String, WidgetRating> getUsersWidgetRatings(String userId) {
         Query q = query(where("ratings").elemMatch(where("userId").is(userId)));
         List<Widget> widgets = template.find(q);
-        Map<String , WidgetRating> ratings = Maps.newHashMap();
+        Map<String, WidgetRating> ratings = Maps.newHashMap();
         for (Widget widget : widgets) {
             for (WidgetRating rating : widget.getRatings()) {
                 if (rating.getUserId().equals(userId)) {
@@ -228,9 +232,9 @@ public class MongoDbWidgetRepository imp
 
     private void removeRating(String ratingId, Widget widget) {
         Iterator<WidgetRating> iterator = widget.getRatings().iterator();
-        while(iterator.hasNext()) {
+        while (iterator.hasNext()) {
             WidgetRating comment = iterator.next();
-            if(comment.getId().equals(ratingId)) {
+            if (comment.getId().equals(ratingId)) {
                 iterator.remove();
                 return;
             }
@@ -286,7 +290,7 @@ public class MongoDbWidgetRepository imp
 
     @Override
     public WidgetTag getTagById(String id) {
-        throw new NotSupportedException();
+        throw new NotSupportedException("Widget tags are not stored by ID");
     }
 
     @Override
@@ -294,46 +298,51 @@ public class MongoDbWidgetRepository imp
         Widget widget = template.get(widgetId);
         updateOrAddTag(widget, item);
         Widget saved = template.save(widget);
-        //return getTagByKeyword(item.getTag().getKeyword(), saved);
-        //TODO: FIX
-        return null;
+        return getWidgetTagByTagId(saved, item.getTagId());
     }
 
     @Override
-    public void deleteWidgetTag(WidgetTag item) {/*
-        Widget widget = template.get(item.getWidgetId());
-        removeTag(item.getTag().getKeyword(), widget);*/
+    public void deleteWidgetTag(WidgetTag item) {
+        List<Widget> widgets = template.find(query(where("tags").elemMatch(where("tagId").is(item.getTagId()).and("userId").is(item.getUserId()).and("createdDate").is(item.getCreatedDate()))));
+        if(widgets.size() > 1 || widgets.size() == 0) {
+            throw new IllegalArgumentException("Unable to delete tag.  Indistinguishable from a tag on another widget or the tag doesn't exist");
+        } else {
+            Widget widget = widgets.get(0);
+            removeTag(item.getTagId(), widget);
+            save(widget);
+        }
     }
 
     private void updateOrAddTag(Widget widget, WidgetTag item) {
-        //The current programming model expects there to be only one instance of a tag
-        //consider an update a NOOP unless it is a new tag.
-        /*WidgetTag tag = getTagByKeyword(item.getTag().getKeyword(), widget);
-        if(tag == null) {
+        //Tags can only be created once.  No reason to update the tag if it has already been made.
+        WidgetTag tag = getWidgetTagByTagId(widget, item.getTagId());
+        if (tag == null) {
             widget.getTags().add(item);
-        }*/
+        }
     }
 
-    private void removeTag(String keyword, Widget widget) {
-       /* Iterator<WidgetTag> iterator = widget.getTags().iterator();
+    private void removeTag(String id, Widget widget) {
+        Iterator<WidgetTag> iterator = widget.getTags().iterator();
         while (iterator.hasNext()) {
-            WidgetTag comment = iterator.next();
-            if (comment.getTag().getKeyword().equals(keyword)) {
+            WidgetTag widgetTag = iterator.next();
+            if (widgetTag.getTagId().equals(id)) {
                 iterator.remove();
                 return;
             }
-        }*/
+        }
     }
 
     private WidgetTag getTagByKeyword(String keyword, Widget widget) {
-        /*for(WidgetTag tag : widget.getTags()) {
-            if(tag.getTag().getKeyword().equals(keyword)) {
-                return tag;
+        Tag tag = tagTemplate.findOne(query(where("keyword").is(keyword)));
+        return tag == null ? null : getWidgetTagByTagId(widget, tag.getId());
+    }
+
+    private WidgetTag getWidgetTagByTagId(Widget widget, String tagId) {
+        for (WidgetTag widgetTag : widget.getTags()) {
+            if (widgetTag.getTagId().equals(tagId)) {
+                return widgetTag;
             }
         }
-        return null;*/
-
-        //TODO: FIX
         return null;
     }
 
@@ -372,9 +381,9 @@ public class MongoDbWidgetRepository imp
 
     @Override
     public int deleteAllWidgetComments(String userId) {
-        int count=0;
+        int count = 0;
         List<Widget> widgets = template.find(query(where("comments").elemMatch(where("userId").is(userId))));
-        for(Widget widget : widgets) {
+        for (Widget widget : widgets) {
             count += updateWidget(userId, widget);
         }
         return count;
@@ -382,9 +391,9 @@ public class MongoDbWidgetRepository imp
 
     private void removeComment(String commentId, Widget widget) {
         Iterator<WidgetComment> iterator = widget.getComments().iterator();
-        while(iterator.hasNext()) {
+        while (iterator.hasNext()) {
             WidgetComment comment = iterator.next();
-            if(comment.getId().equals(commentId)) {
+            if (comment.getId().equals(commentId)) {
                 iterator.remove();
                 return;
             }
@@ -395,23 +404,23 @@ public class MongoDbWidgetRepository imp
         int count = 0;
 
         Iterator<WidgetComment> iterator = widget.getComments().iterator();
-        while(iterator.hasNext()) {
+        while (iterator.hasNext()) {
             WidgetComment comment = iterator.next();
-            if(comment.getUserId().equals(userId)) {
+            if (comment.getUserId().equals(userId)) {
                 iterator.remove();
                 count++;
             }
         }
-        if(count > 0) {
+        if (count > 0) {
             template.save(widget);
         }
         return count;
     }
 
     private WidgetComment getCommentById(Widget widget, String id) {
-        if(widget != null){
-            for(WidgetComment comment : widget.getComments()) {
-                if(comment.getId().equals(id)) {
+        if (widget != null) {
+            for (WidgetComment comment : widget.getComments()) {
+                if (comment.getId().equals(id)) {
                     return comment;
                 }
             }
@@ -420,8 +429,8 @@ public class MongoDbWidgetRepository imp
     }
 
     private WidgetComment updateComment(Widget widget, WidgetComment item) {
-        for(WidgetComment comment : widget.getComments()) {
-            if(comment.getId().equals(item.getId())) {
+        for (WidgetComment comment : widget.getComments()) {
+            if (comment.getId().equals(item.getId())) {
                 comment.setLastModifiedDate(new Date());
                 comment.setText(item.getText());
                 comment.setUserId(item.getUserId());
@@ -477,4 +486,7 @@ public class MongoDbWidgetRepository imp
         this.statsAggregator = statsAggregator;
     }
 
+    public void setTagTemplate(MongoTagOperations tagTemplate) {
+        this.tagTemplate = tagTemplate;
+    }
 }

Added: rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoTagTemplate.java
URL: http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoTagTemplate.java?rev=1426640&view=auto
==============================================================================
--- rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoTagTemplate.java (added)
+++ rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoTagTemplate.java Fri Dec 28 21:27:52 2012
@@ -0,0 +1,16 @@
+package org.apache.rave.portal.repository.impl;
+
+import org.apache.rave.portal.model.Tag;
+import org.apache.rave.portal.model.impl.TagImpl;
+import org.apache.rave.portal.repository.MongoTagOperations;
+
+import static org.apache.rave.portal.repository.util.CollectionNames.TAG_COLLECTION;
+
+/**
+ *
+ */
+public class MongoTagTemplate extends MongoModelTemplate<Tag, TagImpl> implements MongoTagOperations {
+    public MongoTagTemplate() {
+        super(Tag.class, TagImpl.class, TAG_COLLECTION);
+    }
+}

Modified: rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/util/CollectionNames.java
URL: http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/util/CollectionNames.java?rev=1426640&r1=1426639&r2=1426640&view=diff
==============================================================================
--- rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/util/CollectionNames.java (original)
+++ rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/util/CollectionNames.java Fri Dec 28 21:27:52 2012
@@ -24,6 +24,7 @@ public class CollectionNames {
     private CollectionNames() {}
 
     public static final String WIDGET_COLLECTION = "widget";
+    public static final String TAG_COLLECTION = "tag";
     public static final String USER_COLLECTION = "person";
     public static final String PERSON_COLLECTION = USER_COLLECTION;
     public static final String PAGE_COLLECTION = "page";

Modified: rave/branches/mongo/rave-components/rave-mongodb/src/test/java/org/apache/rave/portal/repository/impl/MongoDbTagRepositoryTest.java
URL: http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/test/java/org/apache/rave/portal/repository/impl/MongoDbTagRepositoryTest.java?rev=1426640&r1=1426639&r2=1426640&view=diff
==============================================================================
--- rave/branches/mongo/rave-components/rave-mongodb/src/test/java/org/apache/rave/portal/repository/impl/MongoDbTagRepositoryTest.java (original)
+++ rave/branches/mongo/rave-components/rave-mongodb/src/test/java/org/apache/rave/portal/repository/impl/MongoDbTagRepositoryTest.java Fri Dec 28 21:27:52 2012
@@ -20,19 +20,15 @@
 package org.apache.rave.portal.repository.impl;
 
 import com.google.common.collect.Lists;
-import org.apache.rave.exception.NotSupportedException;
 import org.apache.rave.portal.model.Tag;
-import org.apache.rave.portal.model.Widget;
-import org.apache.rave.portal.model.WidgetTag;
 import org.apache.rave.portal.model.impl.TagImpl;
-import org.apache.rave.portal.model.impl.WidgetImpl;
-import org.apache.rave.portal.model.impl.WidgetTagImpl;
-import org.apache.rave.portal.repository.MongoWidgetOperations;
+import org.apache.rave.portal.repository.MongoTagOperations;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
+import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 
+import java.util.Arrays;
 import java.util.List;
 
 import static org.easymock.EasyMock.*;
@@ -45,92 +41,109 @@ import static org.junit.Assert.assertTha
  */
 public class MongoDbTagRepositoryTest {
 
-    private MongoWidgetOperations widgetTemplate;
+    private MongoTagOperations tagTemplate;
     private MongoDbTagRepository repo;
 
     @Before
     public void setUp(){
-        widgetTemplate = createMock(MongoWidgetOperations.class);
+        tagTemplate = createMock(MongoTagOperations.class);
         repo = new MongoDbTagRepository();
-        repo.setWidgetTemplate(widgetTemplate);
+        repo.setWidgetTemplate(tagTemplate);
 
     }
 
-    @Test @Ignore("Fix before merge")
+    @Test
     public void getAll(){
-        List<Widget> widgets = Lists.newArrayList();
-        List<WidgetTag> widget_tags = Lists.newArrayList();
-        WidgetTag wt = new WidgetTagImpl();
-        Tag tag = new TagImpl();
-        widget_tags.add(wt);
-        Widget w = new WidgetImpl();
-        w.setTags(widget_tags);
-        widgets.add(w);
-
-        expect(widgetTemplate.find(new Query())).andReturn(widgets);
-        expect(widgetTemplate.find(new Query())).andReturn(widgets);
-        replay(widgetTemplate);
+        List<Tag> tags = Arrays.<Tag>asList(new TagImpl(), new TagImpl());
+
+        expect(tagTemplate.find(new Query())).andReturn(tags);
+        replay(tagTemplate);
 
         List<Tag> result = repo.getAll();
         assertNotNull(result);
-        assertThat(result.get(0), is(sameInstance(tag)));
+        assertThat(result.size(), is(equalTo(tags.size())));
+
+    }
+
+    @Test
+    public void countAll(){
 
-        int count = repo.getCountAll();
-        assertThat(count, is(equalTo(1)));
+        expect(tagTemplate.count(new Query())).andReturn(2L);
+        replay(tagTemplate);
+
+        int result = repo.getCountAll();
+        assertThat(result, is(equalTo(2)));
 
     }
 
     @Test
     public void getAll_null(){
-        List<Widget> widgets = Lists.newArrayList();
-        Widget w = new WidgetImpl();
-        widgets.add(w);
 
-        expect(widgetTemplate.find(new Query())).andReturn(widgets);
-        replay(widgetTemplate);
+        expect(tagTemplate.find(new Query())).andReturn(Lists.<Tag>newArrayList());
+        replay(tagTemplate);
 
         List<Tag> result = repo.getAll();
         assertThat(result.size(), is(equalTo(0)));
 
     }
 
-    @Test (expected = NotSupportedException.class)
-    public void save(){
-        Tag tag = new TagImpl();
-        repo.save(tag);
+    @Test
+    public void getByKeyword() {
+        String keyword = "key";
+        Tag t = new TagImpl("1", keyword);
+        expect(tagTemplate.findOne(Query.query(Criteria.where("keyword").is(keyword)))).andReturn(t);
+        replay(tagTemplate);
 
+        Tag fromRepo = repo.getByKeyword(keyword);
+        assertThat(fromRepo.getKeyword(), is(equalTo(keyword)));
     }
 
-    @Test (expected = NotSupportedException.class)
-    public void delete(){
-        Tag tag = new TagImpl();
-        repo.delete(tag);
+    @Test
+    public void get() {
+        String keyword = "key";
+        String id = "1";
+        Tag t = new TagImpl(id, keyword);
+        expect(tagTemplate.get(id)).andReturn(t);
+        replay(tagTemplate);
+
+        Tag fromRepo = repo.get(id);
+        assertThat(fromRepo.getId(), is(equalTo(id)));
+        assertThat(fromRepo.getKeyword(), is(equalTo(keyword)));
+    }
 
+    @Test
+    public void save(){
+        String keyword = "KEYWORD";
+        Tag tag = new TagImpl("ID", keyword);
+        expect(tagTemplate.count(Query.query(Criteria.where("keyword").is(keyword)))).andReturn(0L);
+        expect(tagTemplate.save(tag)).andReturn(tag);
+        replay(tagTemplate);
+        Tag returned = repo.save(tag);
+        verify(tagTemplate);
+        assertThat(returned, is(sameInstance(tag)));
     }
 
-//    @Test
-//    public void getAvailableTagsByWidgetId(){
-//        List<Widget> widgets = Lists.newArrayList();
-//        List<WidgetTag> widget_tags = Lists.newArrayList();
-//        WidgetTag wt = new WidgetTagImpl();
-//        wt.setWidgetId(1111L);
-//        Tag tag = new TagImpl();
-//        wt.setTag(tag);
-//        widget_tags.add(wt);
-//        Widget w = new WidgetImpl(1234L);
-//        w.setTags(widget_tags);
-//        widgets.add(w);
-//
-//        expect(widgetTemplate.find(new Query())).andReturn(widgets);
-//        // The following expect is getting this error...
-//        // Method threw 'java.lang.NullPointerException' exception.
-//        // Cannot evaluate org.easymock.internal.Invocation.toString()
-//        expect(widgetTemplate.get(1234L).getTags()).andReturn(widget_tags);
-//        replay(widgetTemplate);
-//
-//        List<Tag> result = repo.getAvailableTagsByWidgetId(1234L);
-//        assertThat(result.size(), is(equalTo(1)));
-//    }
+    @Test
+    public void save_more(){
+        String keyword = "KEYWORD";
+        Tag tag = new TagImpl("ID", keyword);
+        expect(tagTemplate.count(Query.query(Criteria.where("keyword").is(keyword)))).andReturn(1L);
+        replay(tagTemplate);
+        Tag returned = repo.save(tag);
+        verify(tagTemplate);
+        assertThat(returned, is(sameInstance(tag)));
+    }
 
+    @Test
+    public void delete(){
+        String id ="id";
+        Tag tag = new TagImpl(id, "keyword");
+        tagTemplate.remove(Query.query(Criteria.where("_id").is(id)));
+        expectLastCall();
+        replay(tagTemplate);
 
+        repo.delete(tag);
+        verify(tagTemplate);
+
+    }
 }