/* Copyright (c) 2012-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: * Gabriel Roldan (Boundless) - initial implementation */ package org.locationtech.geogig.api.plumbing; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.locationtech.geogig.api.ObjectId.forString; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.locationtech.geogig.api.Context; import org.locationtech.geogig.api.ObjectId; import org.locationtech.geogig.api.Ref; import org.locationtech.geogig.api.RevObject.TYPE; import org.locationtech.geogig.api.SymRef; import org.locationtech.geogig.storage.RefDatabase; import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; /** * */ public class RefParseTest { private RefDatabase mockRefDb; private RefParse command; @Before public void setUp() { mockRefDb = mock(RefDatabase.class); Builder<String, String> builder = ImmutableMap.builder(); Map<String, String> allRefs = builder// .put("refs/heads/master", forString("refs/heads/master").toString())// .put("refs/heads/branch1", forString("refs/heads/branch1").toString())// .put("refs/heads/v1.1", forString("refs/heads/v1.1").toString())// .put("refs/tags/tag1", forString("refs/tags/tag1").toString())// .put("refs/tags/v1.1", forString("refs/tags/v1.1").toString())// .put("refs/remotes/origin/master", forString("refs/remotes/origin/master").toString())// .put("refs/remotes/origin/branch1", forString("refs/remotes/origin/branch1").toString())// .put("refs/remotes/juan/master", forString("refs/remotes/juan/master").toString())// .put("refs/remotes/juan/v1.1", forString("refs/remotes/juan/v1.1").toString())// .build(); when(mockRefDb.getAll()).thenReturn(allRefs); command = new RefParse(); for (String name : allRefs.keySet()) { when(mockRefDb.getRef(eq(name))).thenReturn(allRefs.get(name)); } Context mockCommandLocator = mock(Context.class); when(mockCommandLocator.refDatabase()).thenReturn(mockRefDb); command.setContext(mockCommandLocator); ResolveObjectType mockResolveObjectType = mock(ResolveObjectType.class); when(mockCommandLocator.command(eq(ResolveObjectType.class))).thenReturn( mockResolveObjectType); when(mockResolveObjectType.setObjectId((ObjectId) anyObject())).thenReturn( mockResolveObjectType); when(mockResolveObjectType.call()).thenReturn(TYPE.COMMIT); } @Test public void testPreconditions() { try { command.call(); fail("expected ISE"); } catch (IllegalStateException e) { assertTrue(e.getMessage().contains("name has not been set")); } } @Test public void testNonExistentRef() { assertFalse(command.setName("HEADs").call().isPresent()); assertFalse(command.setName("remotes/upstream").call().isPresent()); assertFalse(command.setName("refs/remotes/origin/badbranch").call().isPresent()); } @Test public void testParseCompleteRef() { String refName = "refs/heads/master"; Optional<Ref> ref = command.setName(refName).call(); assertTrue(ref.isPresent()); assertEquals(refName, ref.get().getName()); assertEquals(forString(refName), ref.get().getObjectId()); refName = "refs/remotes/juan/v1.1"; testRsolvePartial(refName, refName); } @Test public void testResolvePartial() { testRsolvePartial("master", "refs/heads/master"); testRsolvePartial("heads/master", "refs/heads/master"); testRsolvePartial("branch1", "refs/heads/branch1"); testRsolvePartial("v1.1", "refs/heads/v1.1"); testRsolvePartial("remotes/juan/master", "refs/remotes/juan/master"); testRsolvePartial("juan/master", "refs/remotes/juan/master"); testRsolvePartial("tags/v1.1", "refs/tags/v1.1"); testRsolvePartial("tag1", "refs/tags/tag1"); } private void testRsolvePartial(String refSpec, String refName) { Optional<Ref> ref; ref = command.setName(refSpec).call(); assertTrue(ref.isPresent()); assertEquals(refName, ref.get().getName()); assertEquals(forString(refName), ref.get().getObjectId()); } @Test public void testResolveSymbolicRef() { when(mockRefDb.getRef(eq("HEAD"))).thenThrow(new IllegalArgumentException()); when(mockRefDb.getSymRef(eq("HEAD"))).thenReturn("refs/heads/branch1"); Optional<Ref> ref = command.setName("HEAD").call(); assertTrue(ref.isPresent()); assertTrue(ref.get() instanceof SymRef); assertEquals("HEAD", ref.get().getName()); assertEquals("refs/heads/branch1", ((SymRef) ref.get()).getTarget()); } }