/* Copyright (c) 2013-2014 Boundless and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Distribution License v1.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/org/documents/edl-v10.html * * Contributors: * Victor Olaya (Boundless) - initial implementation */ package org.locationtech.geogig.test.integration; import java.util.Collection; import java.util.Map; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.locationtech.geogig.api.NodeRef; import org.locationtech.geogig.api.RevCommit; import org.locationtech.geogig.api.porcelain.BlameException; import org.locationtech.geogig.api.porcelain.BlameException.StatusCode; import org.locationtech.geogig.api.porcelain.BlameOp; import org.locationtech.geogig.api.porcelain.BlameReport; import org.locationtech.geogig.api.porcelain.CommitOp; import org.locationtech.geogig.api.porcelain.ValueAndCommit; import org.opengis.feature.Feature; public class BlameOpTest extends RepositoryTestCase { @Rule public ExpectedException exception = ExpectedException.none(); @Override protected void setUpInternal() throws Exception { } @Test public void testBlameChangedByASingleCommit() throws Exception { insertAndAdd(points1); RevCommit firstCommit = geogig.command(CommitOp.class).call(); String path = NodeRef.appendChild(pointsName, idP1); BlameReport report = geogig.command(BlameOp.class).setPath(path).call(); Map<String, ValueAndCommit> changes = report.getChanges(); assertEquals(3, changes.size()); Collection<ValueAndCommit> commits = changes.values(); for (ValueAndCommit valueAndCommit : commits) { assertEquals(firstCommit, valueAndCommit.commit); } } @Test public void testBlameChangedByLastCommit() throws Exception { insertAndAdd(points1); geogig.command(CommitOp.class).call(); insertAndAdd(points1_modified); RevCommit secondCommit = geogig.command(CommitOp.class).call(); String path = NodeRef.appendChild(pointsName, idP1); BlameReport report = geogig.command(BlameOp.class).setPath(path).call(); Map<String, ValueAndCommit> changes = report.getChanges(); assertEquals(3, changes.size()); Collection<ValueAndCommit> commits = changes.values(); for (ValueAndCommit valueAndCommit : commits) { assertEquals(secondCommit, valueAndCommit.commit); } } @Test public void testBlameChangedByTwoCommits() throws Exception { insertAndAdd(points1); RevCommit firstCommit = geogig.command(CommitOp.class).call(); Feature pointsModified = feature(pointsType, idP1, "StringProp1_3", new Integer(1000), "POINT(1 1)"); insertAndAdd(pointsModified); RevCommit secondCommit = geogig.command(CommitOp.class).call(); String path = NodeRef.appendChild(pointsName, idP1); BlameReport report = geogig.command(BlameOp.class).setPath(path).call(); Map<String, ValueAndCommit> changes = report.getChanges(); assertEquals(3, changes.size()); assertEquals(secondCommit, changes.get("sp").commit); assertEquals(firstCommit, changes.get("ip").commit); assertEquals(firstCommit, changes.get("pp").commit); assertEquals(pointsModified.getProperty("sp").getValue(), changes.get("sp").value.get()); assertEquals(points1.getProperty("ip").getValue(), changes.get("ip").value.get()); assertEquals(points1.getProperty("pp").getValue(), changes.get("pp").value.get()); report = geogig.command(BlameOp.class).setPath(path).setCommit(firstCommit.getId()).call(); changes = report.getChanges(); assertEquals(3, changes.size()); Collection<ValueAndCommit> commits = changes.values(); for (ValueAndCommit valueAndCommit : commits) { assertEquals(firstCommit, valueAndCommit.commit); } } @Test public void testBlameRemovedAndAdded() throws Exception { insertAndAdd(points1); RevCommit firstCommit = geogig.command(CommitOp.class).call(); deleteAndAdd(points1); RevCommit secondCommit = geogig.command(CommitOp.class).call(); insertAndAdd(points1); RevCommit thirdCommit = geogig.command(CommitOp.class).call(); String path = NodeRef.appendChild(pointsName, idP1); BlameReport report = geogig.command(BlameOp.class).setPath(path).call(); Map<String, ValueAndCommit> changes = report.getChanges(); assertEquals(3, changes.size()); Collection<ValueAndCommit> commits = changes.values(); for (ValueAndCommit valueAndCommit : commits) { assertEquals(thirdCommit, valueAndCommit.commit); } try { report = geogig.command(BlameOp.class).setPath(path).setCommit(secondCommit.getId()) .call(); fail(); } catch (BlameException e) { assertTrue(e.statusCode == StatusCode.FEATURE_NOT_FOUND); } report = geogig.command(BlameOp.class).setPath(path).setCommit(firstCommit.getId()).call(); changes = report.getChanges(); assertEquals(3, changes.size()); commits = changes.values(); for (ValueAndCommit valueAndCommit : commits) { assertEquals(firstCommit, valueAndCommit.commit); } } @Test public void testBlameWithWrongFeaturePath() throws Exception { insertAndAdd(points1); geogig.command(CommitOp.class).call(); try { geogig.command(BlameOp.class).setPath("wrongpath").call(); fail(); } catch (BlameException e) { assertTrue(e.statusCode == StatusCode.FEATURE_NOT_FOUND); } } @Test public void testBlameWithFeatureType() throws Exception { insertAndAdd(points1); geogig.command(CommitOp.class).call(); try { geogig.command(BlameOp.class).setPath(pointsName).call(); fail(); } catch (BlameException e) { assertTrue(e.statusCode == StatusCode.PATH_NOT_FEATURE); } } }