/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.guvnor.structure.backend.repositories.git;
import java.util.HashMap;
import java.util.Map;
import org.guvnor.structure.repositories.impl.GitMetadataImpl;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.uberfire.backend.server.io.object.ObjectStorage;
import static org.jgroups.util.Util.*;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class GitMetadataImplStoreTest {
private GitMetadataStoreImpl metadataStore;
@Mock
private ObjectStorage storage;
private Map<String, GitMetadataImpl> metadatas;
@Before
public void setUp() throws Exception {
metadataStore = new GitMetadataStoreImpl( storage );
metadatas = new HashMap<>();
doAnswer( invocationOnMock -> {
String key = invocationOnMock.getArgumentAt( 0, String.class );
GitMetadataImpl metadata = invocationOnMock.getArgumentAt( 1, GitMetadataImpl.class );
metadatas.put( key, metadata );
return null;
} ).when( storage ).write( anyString(), any() );
doAnswer( invocationOnMock -> {
String key = invocationOnMock.getArgumentAt( 0, String.class );
return metadatas.get( key );
} ).when( storage ).read( anyString() );
doAnswer( invocationOnMock -> {
String key = invocationOnMock.getArgumentAt( 0, String.class );
return metadatas.remove( key );
} ).when( storage ).delete( anyString() );
}
@Test
public void testStorageInitialization() {
metadataStore.init();
verify( storage ).init( eq( "default://system/metadata" ) );
}
@Test
public void testCreatesRightPathToSave() {
metadataStore.write( "test/repo", "" );
verify( storage ).write( eq( "/test/repo.metadata" ), anyObject() );
}
@Test
public void testFixRightPathToSave() {
metadataStore.write( "/test/repo", "" );
verify( storage ).write( eq( "/test/repo.metadata" ), anyObject() );
}
@Test
public void testWriteNewMetadataWithoutOrigin() {
metadataStore.write( "test/repo" );
assertEquals( "test/repo", metadatas.get( "/test/repo.metadata" ).getName() );
}
@Test
public void testWriteNewMetadataWithOrigin() {
metadataStore.write( "test/repo", "other/repo" );
assertEquals( "test/repo", metadatas.get( "/test/repo.metadata" ).getName() );
assertEquals( "other/repo", metadatas.get( "/other/repo.metadata" ).getName() );
}
@Test
public void testChangeOriginFromMetedata() {
metadataStore.write( "test/repo", "other/repo" );
assertEquals( "test/repo", metadatas.get( "/test/repo.metadata" ).getName() );
assertEquals( "other/repo", metadatas.get( "/test/repo.metadata" ).getOrigin() );
assertEquals( "other/repo", metadatas.get( "/other/repo.metadata" ).getName() );
metadataStore.write( "test/repo", "other/otherOrigin" );
assertEquals( "other/otherOrigin", metadatas.get( "/test/repo.metadata" ).getOrigin() );
assertEquals( 0, metadatas.get( "/other/repo.metadata" ).getForks().size() );
}
@Test
public void testWriteWithNullOrigin() {
String origin = null;
metadataStore.write( "test/repo", origin );
assertEquals( "test/repo", metadatas.get( "/test/repo.metadata" ).getName() );
}
@Test
public void testWriteTwoForks() {
metadataStore.write( "test/repo", "origin/repo" );
metadataStore.write( "fork/repo", "origin/repo" );
assertEquals( 3, metadatas.size() );
assertEquals( "test/repo", metadatas.get( "/test/repo.metadata" ).getName() );
assertEquals( "fork/repo", metadatas.get( "/fork/repo.metadata" ).getName() );
assertEquals( "origin/repo", metadatas.get( "/origin/repo.metadata" ).getName() );
assertEquals( 2, metadatas.get( "/origin/repo.metadata" ).getForks().size() );
}
@Test
public void testComplexForkTracking() {
metadataStore.write( "b/repo", "a/repo" );
metadataStore.write( "c/repo", "b/repo" );
metadataStore.write( "d/repo", "c/repo" );
assertEquals( "c/repo", metadataStore.read( "d/repo" ).get().getOrigin() );
assertEquals( "b/repo", metadataStore.read( "c/repo" ).get().getOrigin() );
assertEquals( "a/repo", metadataStore.read( "b/repo" ).get().getOrigin() );
assertEquals( "b/repo", metadataStore.read( "a/repo" ).get().getForks().get( 0 ) );
assertEquals( "c/repo", metadataStore.read( "b/repo" ).get().getForks().get( 0 ) );
assertEquals( "d/repo", metadataStore.read( "c/repo" ).get().getForks().get( 0 ) );
}
@Test
public void testSimpleDelete() {
metadataStore.write( "a/repo", "" );
assertEquals( "", metadataStore.read( "a/repo" ).get().getOrigin() );
metadataStore.delete( "a/repo" );
assertFalse( metadataStore.read( "a/repo" ).isPresent() );
}
@Test
public void testComplexDelete() {
metadataStore.write( "b/repo", "a/repo" );
metadataStore.write( "c/repo", "b/repo" );
metadataStore.write( "d/repo", "c/repo" );
metadataStore.delete( "c/repo" );
assertEquals( "", metadataStore.read( "d/repo" ).get().getOrigin() );
assertEquals( "a/repo", metadataStore.read( "b/repo" ).get().getOrigin() );
assertEquals( "b/repo", metadataStore.read( "a/repo" ).get().getForks().get( 0 ) );
assertEquals( 0, metadataStore.read( "b/repo" ).get().getForks().size() );
assertFalse( metadataStore.read( "c/repo" ).isPresent() );
}
}