/*
 * Copyright 2012 John Crygier
 * Copyright 2012 gitblit.com
 *
 * 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 com.gitblit.tests;

import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import com.gitblit.Constants;
import com.gitblit.models.RepositoryModel;

public class RepositoryModelTest extends GitblitUnitTest {

	private static boolean wasStarted = false;

	@BeforeClass
	public static void startGitBlit() throws Exception {
		wasStarted = GitBlitSuite.startGitblit() == false;
	}

	@AfterClass
	public static void stopGitBlit() throws Exception {
		if (wasStarted == false)
			GitBlitSuite.stopGitblit();
	}

	@Before
	public void initializeConfiguration() throws Exception{
		Repository r = GitBlitSuite.getHelloworldRepository();
		StoredConfig config = r.getConfig();

		config.unsetSection(Constants.CONFIG_GITBLIT, Constants.CONFIG_CUSTOM_FIELDS);
		config.setString(Constants.CONFIG_GITBLIT, Constants.CONFIG_CUSTOM_FIELDS, "commitMessageRegEx", "\\d");
		config.setString(Constants.CONFIG_GITBLIT, Constants.CONFIG_CUSTOM_FIELDS, "anotherProperty", "Hello");

		config.save();
	}

	@After
	public void teardownConfiguration() throws Exception {
		Repository r = GitBlitSuite.getHelloworldRepository();
		StoredConfig config = r.getConfig();

		config.unsetSection(Constants.CONFIG_GITBLIT, Constants.CONFIG_CUSTOM_FIELDS);
		config.save();
	}

	@Test
	public void testGetCustomProperty() throws Exception {
		RepositoryModel model = repositories().getRepositoryModel(
				GitBlitSuite.getHelloworldRepository().getDirectory().getName());

		assertEquals("\\d", model.customFields.get("commitMessageRegEx"));
		assertEquals("Hello", model.customFields.get("anotherProperty"));
	}

	@Test
	public void testSetCustomProperty() throws Exception {
		RepositoryModel model = repositories().getRepositoryModel(
				GitBlitSuite.getHelloworldRepository().getDirectory().getName());

		assertEquals("\\d", model.customFields.get("commitMessageRegEx"));
		assertEquals("Hello", model.customFields.get("anotherProperty"));

		assertEquals("Hello", model.customFields.put("anotherProperty", "GoodBye"));
		repositories().updateRepositoryModel(model.name, model, false);

		model = repositories().getRepositoryModel(
				GitBlitSuite.getHelloworldRepository().getDirectory().getName());

		assertEquals("\\d", model.customFields.get("commitMessageRegEx"));
		assertEquals("GoodBye", model.customFields.get("anotherProperty"));
	}

}
