//
// Copyright (c) 2011 Linkeos.
//
// This file is part of Elveos.org.
// Elveos.org is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation, either version 3 of the License, or (at your
// option) any later version.
//
// Elveos.org is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
// more details.
// You should have received a copy of the GNU General Public License along
// with Elveos.org. If not, see http://www.gnu.org/licenses/.
//
package com.bloatit.data;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.math.BigDecimal;
import org.junit.Test;
import com.bloatit.data.queries.DBRequests;
import com.bloatit.data.search.FeatureSearch;
import com.bloatit.framework.utils.datetime.DateUtils;
import com.bloatit.framework.utils.i18n.Language;
/**
* I assume the DaoGroupMemberTest is run without error.
*/
public class DaoFeatureTest extends DataTestUnit {
@Test
public void testCreateFeature() {
final DaoFeature feature = DaoFeature.createAndPersist(yo,
null,
DaoDescription.createAndPersist(yo,
null,
Language.FR,
"Ma super demande !",
"Ceci est la descption de ma demande :) "),
project);
assertEquals(feature, yo.getFeatures(false).iterator().next());
}
@Test
public void testRetrieveFeature() {
final DaoFeature feature = DaoFeature.createAndPersist(yo,
null,
DaoDescription.createAndPersist(yo,
null,
Language.FR,
"Ma super demande !",
"Ceci est la descption de ma demande :) "),
project);
assertEquals(feature, DBRequests.getAll(DaoFeature.class).iterator().next());
assertEquals(yo, feature.getMember());
}
@Test
public void testAddContribution() throws Throwable {
DaoFeature feature = DaoFeature.createAndPersist(yo,
null,
DaoDescription.createAndPersist(yo,
null,
Language.FR,
"Ma super demande !",
"Ceci est la descption de ma demande :) "),
project);
fred.getInternalAccount().setAmount(new BigDecimal("100"));
yo.getInternalAccount().setAmount(new BigDecimal("100"));
feature.addContribution(fred, null, new BigDecimal("25.00"), "Contribution");
feature.addContribution(yo, null, new BigDecimal("18.00"), "I'm so generous");
feature = DBRequests.getById(DaoFeature.class, feature.getId());
assertEquals(2, feature.getContributions().size());
assertEquals(0, fred.getInternalAccount().getBlocked().compareTo(new BigDecimal("25")));
assertEquals(0, fred.getInternalAccount().getAmount().compareTo(new BigDecimal("75")));
assertEquals(0, yo.getInternalAccount().getBlocked().compareTo(new BigDecimal("18")));
assertEquals(0, yo.getInternalAccount().getAmount().compareTo(new BigDecimal("82")));
// Reset the db:
super.closeDB();
super.createDB();
}
@Test
public void testAddOffer() {
DaoFeature feature = DaoFeature.createAndPersist(yo,
null,
DaoDescription.createAndPersist(yo,
null,
Language.FR,
"Ma super demande !",
"Ceci est la descption de ma demande :) "),
project);
feature = DBRequests.getById(DaoFeature.class, feature.getId());
feature.addOffer(createOffer(feature));
assertEquals(1, feature.getOffers().size());
}
@Test
public void testAddComment() throws Throwable {
DaoFeature feature = DaoFeature.createAndPersist(yo,
null,
DaoDescription.createAndPersist(yo,
null,
Language.FR,
"Ma super demande !",
"Ceci est la descption de ma demande :) "),
project);
feature.addComment(DaoComment.createAndPersist(feature, null, yo, "4"));
feature.addComment(DaoComment.createAndPersist(feature, null, yo, "3"));
feature.addComment(DaoComment.createAndPersist(feature, null, yo, "2"));
feature.addComment(DaoComment.createAndPersist(feature, null, yo, "1"));
feature = DBRequests.getById(DaoFeature.class, feature.getId());
assertEquals(4, feature.getComments().size());
}
@Test
public void testAcceptContributions() throws Throwable {
fred.getInternalAccount().setAmount(new BigDecimal(50));
yo.getInternalAccount().setAmount(new BigDecimal(50));
final DaoFeature feature = DaoFeature.createAndPersist(yo,
null,
DaoDescription.createAndPersist(yo,
null,
Language.FR,
"Ma super demande !",
"Ceci est la descption de ma demande :) "),
project);
final DaoOffer offer = createOffer(feature);
feature.addOffer(offer);
feature.addContribution(fred, null, new BigDecimal("25.00"), "I'm so generous too");
feature.addContribution(yo, null, new BigDecimal("18.00"), "I'm so generous too");
for (final DaoContribution Contribution : feature.getContributions()) {
Contribution.validate(offer.getCurrentMilestone(), 100);
}
assertEquals(0, fred.getInternalAccount().getBlocked().compareTo(new BigDecimal("0")));
assertEquals(0, fred.getInternalAccount().getAmount().compareTo(new BigDecimal("68")));
assertEquals(0, yo.getInternalAccount().getBlocked().compareTo(new BigDecimal("0")));
assertEquals(0, yo.getInternalAccount().getAmount().compareTo(new BigDecimal("32")));
}
private DaoOffer createOffer(final DaoFeature feature) {
return new DaoOffer(fred,
null,
feature,
new BigDecimal("200"),
DaoDescription.createAndPersist(fred, null, Language.FR, "Ma super offre !", "Ceci est la descption de mon Offre:) "),
"GNU GPL",
DateUtils.tomorrow(),
0);
}
@Test
public void testRejectContribution() throws Throwable {
fred = DBRequests.getById(DaoMember.class, fred.getId());
yo = DBRequests.getById(DaoMember.class, yo.getId());
DaoFeature feature = DaoFeature.createAndPersist(yo,
null,
DaoDescription.createAndPersist(yo,
null,
Language.FR,
"Ma super demande !",
"Ceci est la descption de ma demande :) "),
project);
feature.addOffer(createOffer(feature));
fred.getInternalAccount().setAmount(new BigDecimal("100"));
yo.getInternalAccount().setAmount(new BigDecimal("100"));
feature.addContribution(fred, null, new BigDecimal("25.00"), "I'm so generous too");
feature.addContribution(yo, null, new BigDecimal("18.00"), "I'm so generous too");
feature = DBRequests.getById(DaoFeature.class, feature.getId());
fred = DBRequests.getById(DaoMember.class, fred.getId());
yo = DBRequests.getById(DaoMember.class, yo.getId());
for (final DaoContribution contribution : feature.getContributions()) {
contribution.cancel();
}
assertEquals(0, fred.getInternalAccount().getBlocked().compareTo(new BigDecimal("0")));
assertEquals(0, fred.getInternalAccount().getAmount().compareTo(new BigDecimal("100")));
assertEquals(0, yo.getInternalAccount().getBlocked().compareTo(new BigDecimal("0")));
assertEquals(0, yo.getInternalAccount().getAmount().compareTo(new BigDecimal("100")));
}
@Test
public void testGetCurrentOffer() {
fred = DBRequests.getById(DaoMember.class, fred.getId());
yo = DBRequests.getById(DaoMember.class, yo.getId());
final DaoFeature feature = DaoFeature.createAndPersist(yo,
null,
DaoDescription.createAndPersist(yo,
null,
Language.FR,
"Ma super demande !",
"Ceci est la descption de ma demande :) "),
project);
final DaoOffer offer = createOffer(feature);
feature.addOffer(offer);
SessionManager.flush();
feature.setSelectedOffer(feature.computeSelectedOffer());
assertEquals(feature.getSelectedOffer(), offer);
}
@Test
public void testSearchFeature() {
// This is needed to index the new Features.
SessionManager.endWorkUnitAndFlush();
SessionManager.beginWorkUnit();
final FeatureSearch search = new FeatureSearch("");
assertTrue(search.doSearch().size() > 0);
}
@Test
public void testGetComment() {
final DaoFeature feature = DaoFeature.createAndPersist(yo,
null,
DaoDescription.createAndPersist(yo,
null,
Language.FR,
"Ma super demande !",
"Ceci est la descption de ma demande :) "),
project);
feature.addComment(DaoComment.createAndPersist(feature, null, yo, "plop"));
assertNotNull(feature.getComments().iterator().next());
}
}