/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.git.impl;
import com.google.common.collect.ImmutableList;
import com.google.common.io.Files;
import org.eclipse.che.api.git.GitConnection;
import org.eclipse.che.api.git.GitConnectionFactory;
import org.eclipse.che.api.git.exception.GitException;
import org.eclipse.che.api.git.params.AddParams;
import org.eclipse.che.api.git.params.CommitParams;
import org.eclipse.che.api.git.params.LogParams;
import org.eclipse.che.api.git.shared.AddRequest;
import org.eclipse.che.api.git.shared.Revision;
import org.eclipse.che.api.git.shared.StatusFormat;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.File;
import java.io.IOException;
import static java.nio.file.Files.write;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.eclipse.che.git.impl.GitTestUtil.addFile;
import static org.eclipse.che.git.impl.GitTestUtil.cleanupTestRepo;
import static org.eclipse.che.git.impl.GitTestUtil.connectToGitRepositoryWithContent;
import static org.eclipse.che.git.impl.GitTestUtil.connectToInitializedGitRepository;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
/**
* @author Eugene Voevodin
*/
public class CommitTest {
private File repository;
private String CONTENT = "git repository content\n";
@BeforeMethod
public void setUp() {
repository = Files.createTempDir();
}
@AfterMethod
public void cleanUp() {
cleanupTestRepo(repository);
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = org.eclipse.che.git.impl.GitConnectionFactoryProvider.class)
public void testSimpleCommit(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToInitializedGitRepository(connectionFactory, repository);
//add new File
addFile(connection, "DONTREADME", "secret");
//add changes
connection.add(AddParams.create(AddRequest.DEFAULT_PATTERN));
//when
CommitParams commitParams = CommitParams.create("Commit message").withAmend(false).withAll(false);
Revision revision = connection.commit(commitParams);
//then
assertEquals(revision.getMessage(), commitParams.getMessage());
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = org.eclipse.che.git.impl.GitConnectionFactoryProvider.class)
public void testCommitWithAddAll(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToInitializedGitRepository(connectionFactory, repository);
addFile(connection, "README.txt", CONTENT);
connection.add(AddParams.create(ImmutableList.of("README.txt")));
connection.commit(CommitParams.create("Initial addd"));
//when
//change existing README
addFile(connection, "README.txt", "not secret");
//then
CommitParams commitParams = CommitParams.create("Other commit message").withAmend(false).withAll(true);
Revision revision = connection.commit(commitParams);
assertEquals(revision.getMessage(), commitParams.getMessage());
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = org.eclipse.che.git.impl.GitConnectionFactoryProvider.class)
public void testAmendCommit(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToInitializedGitRepository(connectionFactory, repository);
addFile(connection, "README.txt", CONTENT);
connection.add(AddParams.create(ImmutableList.of("README.txt")));
connection.commit(CommitParams.create("Initial addd"));
int beforeCommitsCount = connection.log(LogParams.create()).getCommits().size();
//when
//change existing README
addFile(connection, "README.txt", "some new content");
CommitParams commitParams = CommitParams.create("Amend commit").withAmend(true).withAll(true);
//then
Revision revision = connection.commit(commitParams);
int afterCommitsCount = connection.log(LogParams.create()).getCommits().size();
assertEquals(revision.getMessage(), commitParams.getMessage());
assertEquals(beforeCommitsCount, afterCommitsCount);
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = org.eclipse.che.git.impl.GitConnectionFactoryProvider.class)
public void testChangeMessageOfLastCommit(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToGitRepositoryWithContent(connectionFactory, repository);
addFile(connection, "NewFile.txt", CONTENT);
connection.add(AddParams.create(ImmutableList.of("NewFile.txt")));
connection.commit(CommitParams.create("First commit"));
int beforeCommitsCount = connection.log(LogParams.create()).getCommits().size();
//when
CommitParams commitParams = CommitParams.create("Changed message").withAmend(true);
connection.commit(commitParams);
//then
int afterCommitsCount = connection.log(LogParams.create()).getCommits().size();
assertEquals(beforeCommitsCount, afterCommitsCount);
assertEquals(connection.log(LogParams.create()).getCommits().get(0).getMessage(), commitParams.getMessage());
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = org.eclipse.che.git.impl.GitConnectionFactoryProvider.class)
public void testChangeMessageOfLastCommitWithSpecifiedPath(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToGitRepositoryWithContent(connectionFactory, repository);
addFile(connection, "NewFile.txt", CONTENT);
connection.add(AddParams.create(ImmutableList.of("NewFile.txt")));
connection.commit(CommitParams.create("First commit"));
int beforeCommitsCount = connection.log(LogParams.create()).getCommits().size();
//when
CommitParams commitParams = CommitParams.create("Changed message").withFiles(singletonList("NewFile.txt")).withAmend(true);
connection.commit(commitParams);
//then
int afterCommitsCount = connection.log(LogParams.create()).getCommits().size();
assertEquals(beforeCommitsCount, afterCommitsCount);
assertEquals(connection.log(LogParams.create()).getCommits().get(0).getMessage(), commitParams.getMessage());
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = org.eclipse.che.git.impl.GitConnectionFactoryProvider.class)
public void testCommitSeparateFiles(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToGitRepositoryWithContent(connectionFactory, repository);
addFile(connection, "File1.txt", CONTENT);
addFile(connection, "File2.txt", CONTENT);
connection.add(AddParams.create(asList("File1.txt", "File2.txt")));
//when
connection.commit(CommitParams.create("commit").withFiles(singletonList("File1.txt")));
//then
assertTrue(connection.status(StatusFormat.LONG).getAdded().contains("File2.txt"));
assertTrue(connection.status(StatusFormat.LONG).getAdded().size() == 1);
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = org.eclipse.che.git.impl.GitConnectionFactoryProvider.class,
expectedExceptions = GitException.class, expectedExceptionsMessageRegExp = "No changes added to commit")
public void testCommitWithNotStagedChanges(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToGitRepositoryWithContent(connectionFactory, repository);
//Prepare unstaged deletion
addFile(connection, "FileToDelete.txt", "content");
connection.add(AddParams.create(ImmutableList.of("FileToDelete.txt")));
connection.commit(CommitParams.create("File to delete"));
new File(connection.getWorkingDir().getAbsolutePath(), "FileToDelete.txt").delete();
//Prepare unstaged new file
addFile(connection, "newFile", "content");
//Prepare unstaged editing
write(new File(connection.getWorkingDir(), "README.txt").toPath(), "new content".getBytes());
//when
connection.commit(CommitParams.create("test commit"));
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = org.eclipse.che.git.impl.GitConnectionFactoryProvider.class,
expectedExceptions = GitException.class, expectedExceptionsMessageRegExp = "Nothing to commit, working directory clean")
public void testCommitWithCleanIndex(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToGitRepositoryWithContent(connectionFactory, repository);
//when
connection.commit(CommitParams.create("test commit"));
}
}