diff --git a/.eclipse-pmd b/.eclipse-pmd deleted file mode 100644 index c7240957..00000000 --- a/.eclipse-pmd +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.pmd b/.pmd deleted file mode 100644 index 133c62cf..00000000 --- a/.pmd +++ /dev/null @@ -1,8 +0,0 @@ - - - true - pmd_rules.xml - false - true - true - diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index a1c4ec2c..fe147916 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -56,5 +56,4 @@ - diff --git a/Makefile b/Makefile index 46836670..229ee94e 100644 --- a/Makefile +++ b/Makefile @@ -1,79 +1,18 @@ -all: install - -install: compile sonar shippable - cp -rf engine/* target/* shippable - -shippable: - mkdir -p shippable - -sonar: sonarconfig buildreports - ./tools/pullanalize - -sonarconfig: - cp etc/m2/settings.xml ~/.m2 - -compile: zentaworkaround javabuild engine.compiled codedocs - -codedocs: shippable/engine-testcases.xml shippable/engine-implementedBehaviours.xml shippable/engine-implementedBehaviours.html shippable/bugpriorities.xml - -shippable/engine-testcases.xml: engine.richescape shippable - zenta-xslt-runner -xsl:generate_test_cases.xslt -s engine.richescape outputbase=shippable/engine- - -shippable/engine-implementedBehaviours.xml: buildreports shippable - zenta-xslt-runner -xsl:generate-behaviours.xslt -s target/test/javadoc.xml outputbase=shippable/engine- - -CONSISTENCY_INPUTS=shippable/engine-testcases.xml shippable/engine-implementedBehaviours.xml - -include /usr/share/zenta-tools/model.rules - -engine.consistencycheck: engine.rich engine.check $(CONSISTENCY_INPUTS) - zenta-xslt-runner -xsl:xslt/consistencycheck.xslt -s:$(basename $@).check -o:$@ >$(basename $@).consistency.stderr 2>&1 - sed 's/\//:/' <$(basename $@).consistency.stderr |sort --field-separator=':' --key=2 - -testenv: - ./tools/testenv - -javabuild: maven buildreports - touch javabuild - -maven: target/PDEngine-0.0.1-SNAPSHOT.jar javadoc - - -javadoc: - mkdir -p target/production target/test - JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 mvn javadoc:javadoc javadoc:test-javadoc site - -target/PDEngine-0.0.1-SNAPSHOT.jar: maven-prepare keystore maven-build - -maven-prepare: - mvn build-helper:parse-version versions:set versions:commit -DnewVersion=\$${parsedVersion.majorVersion}.\$${parsedVersion.minorVersion}.\$${parsedVersion.incrementalVersion}-$$(tools/getbranch|sed 'sA/A_Ag').$$(git rev-parse --short HEAD) - mvn clean - -maven-build: - mvn org.jacoco:jacoco-maven-plugin:prepare-agent install org.pitest:pitest-maven:mutationCoverage site -Pintegration-test - -buildreports: maven - zenta-xslt-runner -xsl:cpd2pmd.xslt -s:target/pmd.xml -o target/pmd_full.xml - find ~/.m2/repository/org/slf4j/slf4j-api/ -regex .*slf4j-api-[0-9.]*.jar -exec ln -f -s {} /tmp/slf4j-api.jar \; - find ~/.m2/repository/org/slf4j/slf4j-simple/ -regex .*slf4j-simple-[0-9.]*.jar -exec ln -f -s {} /tmp/slf4j-simple.jar \; - java -cp /tmp/slf4j-api.jar:/tmp/slf4j-simple.jar:/usr/local/lib/mutation-analysis-plugin-1.3-SNAPSHOT.jar ch.devcon5.sonar.plugins.mutationanalysis.StandaloneAnalysis - -clean: - git clean -fdx - rm -rf zenta-tools xml-doclet - -inputs/engine.issues.xml: shippable/engine-implementedBehaviours.xml shippable/engine-testcases.xml - mkdir -p inputs - tools/getGithubIssues edemo PDEngine f279765590d25bedfc9f08f7fc39a8c39c891711 >inputs/engine.issues.xml - -zentaworkaround: - mkdir -p ~/.zenta/.metadata/.plugins/org.eclipse.e4.workbench/ - cp workbench.xmi ~/.zenta/.metadata/.plugins/org.eclipse.e4.workbench/ - touch zentaworkaround - -shippable/bugpriorities.xml: engine.consistencycheck inputs/engine.issues.xml engine.richescape shippable - zenta-xslt-runner -xsl:issue-priorities.xslt -s:engine.consistencycheck -o:shippable/bugpriorities.xml issuesfile=inputs/engine.issues.xml modelfile=engine.richescape missingissuefile=shippable/missing.xml - -keystore: - ./tools/generate_keystore - +export GITHUB_ORGANIZATION=edemo +export SONAR_ORG=edemo +export REPO_NAME=PDEngine +MODEL_BASENAME = engine +JAVA_TARGET = PDEngine-0.0.1-SNAPSHOT.jar +BEFORE_MAVEN_BUILD = entropy +BEFORE_SONAR = publish_tests + +include /usr/local/toolchain/rules.java + +entropy: + rm /dev/random; cp -a /dev/urandom /dev/random; set |sed 's/[0-9]/X/g' + +publish_tests: + mvn org.jacoco:jacoco-maven-plugin:report + cp -r target/site/jacoco shippable/codecoverage + mkdir -p shippable/testresults + mv target/surefire-reports/*.xml shippable/testresults diff --git a/cpd2pmd.xslt b/cpd2pmd.xslt deleted file mode 100644 index c20b66e0..00000000 --- a/cpd2pmd.xslt +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Code duplication ( - - lines, - - tokens): - - - - - - - - - - - - - - - - - diff --git a/etc/m2/settings.encrypted.magwas b/etc/m2/settings.encrypted.magwas deleted file mode 100644 index e69de29b..00000000 diff --git a/etc/m2/settings.xml b/etc/m2/settings.xml deleted file mode 100644 index e56ba652..00000000 --- a/etc/m2/settings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - org.sonarsource.scanner.maven - - - - sonar - - true - - - - https://sonarcloud.io - bf0e1ea9341a539f1a291a85509c010498b43cca - - - - diff --git a/generate-behaviours.xslt b/generate-behaviours.xslt deleted file mode 100644 index 029ce470..00000000 --- a/generate-behaviours.xslt +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Implemented behaviours - -
-
- - -
- - - - <xsl:value-of select="$titlestring" /> - - -
-
- - -
- - - <xsl:value-of select="@name" /> - - - - - - -
-
- - - - - - - - - -
- diff --git a/generate_test_cases.xslt b/generate_test_cases.xslt deleted file mode 100644 index 5365ffce..00000000 --- a/generate_test_cases.xslt +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---------------------------------------------------------------------------- - Behaviour: - - @TestedFeature(" - - ") - @TestedOperation(" - - ") - @TestedBehaviour(" - - ") - - @tested_aspect( - - ) - - - - - - - - - - - - - - - - - - - - - - - - . - - - - - - - - - - diff --git a/issue-priorities.xslt b/issue-priorities.xslt deleted file mode 100644 index 551ae65c..00000000 --- a/issue-priorities.xslt +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pmd_rules.xml b/pmd_rules.xml deleted file mode 100644 index c9670557..00000000 --- a/pmd_rules.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - WAR project PMD rules of Kode Konveyor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Rule Description - - 3 - - - - - - - { - // This is ok... -} -]]> - - - - - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - - - - - diff --git a/pom.xml b/pom.xml index 36fe5e3c..91185565 100644 --- a/pom.xml +++ b/pom.xml @@ -12,11 +12,31 @@ org.rulez.demokracia PDEngine - 0.0.1-feature_object_in_metamodel.b874d67 + 0.0.1-feature_toolchain.0146b03 war PDEngine http://maven.apache.org + A voting engine + + + GNU GPL v3 or any later + https://www.gnu.org/licenses/gpl-3.0.en.html + + + + + Community Digital Tools Foundation + info@adatom.hu + Community Digital Tools Foundation + https://e.demokracia.rules.org/ + + + + scm:git:git://github.com/edemo/PDEngine.git + scm:git:ssh://github.com:edemo/PDEngine.git + http://github.com/edemo/PDEngine/tree/master + UTF-8 @@ -207,7 +227,7 @@ true true - pmd_rules.xml + /usr/local/toolchain/pmd_rules.xml diff --git a/shippable.yml b/shippable.yml index 44ad2608..54dfc5da 100644 --- a/shippable.yml +++ b/shippable.yml @@ -1,12 +1,17 @@ -build_image: edemo/pdengine:docker_java11 -language: python -python: - - 2.7 +build_image: kodekonveyor/toolchain:master +integrations: + generic: + - integrationName: kkpipeline + build: + cache: true + cache_dir_list: + - ~/.m2 ci: - - tools/script + - set |sed 's/[0-9]/X/g' + - /usr/local/toolchain/tools/Script on_success: - - tools/publish + - /usr/local/toolchain/tools/publish on_failure: - - tools/publish + - /usr/local/toolchain/tools/publish diff --git a/src/main/java/org/rulez/demokracia/pdengine/assurance/ADAAssuranceManager.java b/src/main/java/org/rulez/demokracia/pdengine/assurance/ADAAssuranceManager.java new file mode 100644 index 00000000..65bc402a --- /dev/null +++ b/src/main/java/org/rulez/demokracia/pdengine/assurance/ADAAssuranceManager.java @@ -0,0 +1,15 @@ +package org.rulez.demokracia.pdengine.assurance; + +import java.util.List; + +import org.springframework.stereotype.Service; + +@Service +public class ADAAssuranceManager implements AssuranceManager { + + @Override + public List getAssurances(final String proxyId) { + throw new UnsupportedOperationException(); + } + +} diff --git a/src/main/java/org/rulez/demokracia/pdengine/assurance/AssuranceManager.java b/src/main/java/org/rulez/demokracia/pdengine/assurance/AssuranceManager.java new file mode 100644 index 00000000..5d3ef23f --- /dev/null +++ b/src/main/java/org/rulez/demokracia/pdengine/assurance/AssuranceManager.java @@ -0,0 +1,11 @@ +package org.rulez.demokracia.pdengine.assurance; + +import java.util.List; + +import org.springframework.stereotype.Service; + +@Service +public interface AssuranceManager { + + List getAssurances(String proxyId); +} diff --git a/src/main/java/org/rulez/demokracia/pdengine/ballot/BallotServiceImpl.java b/src/main/java/org/rulez/demokracia/pdengine/ballot/BallotServiceImpl.java index 753a1a0a..1185e3c8 100644 --- a/src/main/java/org/rulez/demokracia/pdengine/ballot/BallotServiceImpl.java +++ b/src/main/java/org/rulez/demokracia/pdengine/ballot/BallotServiceImpl.java @@ -1,6 +1,7 @@ package org.rulez.demokracia.pdengine.ballot; import java.util.List; + import org.rulez.demokracia.pdengine.RandomUtils; import org.rulez.demokracia.pdengine.authentication.AuthenticatedUserService; import org.rulez.demokracia.pdengine.vote.Vote; @@ -35,24 +36,29 @@ private void checkBallotAsUser(final Vote vote) { vote.increaseRecordedBallots(userName); } - private void checkIfDoesntHaveBallotYet(final Vote vote, final String userName) { + private void + checkIfDoesntHaveBallotYet(final Vote vote, final String userName) { if (vote.getRecordedBallotsCount(userName).intValue() > 0) throw new IllegalArgumentException("This user already have a ballot."); } private void checkIfHasAllAssurances(final Vote vote) { if (!userHasAllAssurance(vote.getNeededAssurances())) - throw new IllegalArgumentException("The user does not have all of the needed assurances."); + throw new IllegalArgumentException( + "The user does not have all of the needed assurances." + ); } private void checkIfAuthenticated() { if (authenticatedUserService.getUserPrincipal() == null) throw new IllegalArgumentException( - "Simple user is not authenticated, cannot issue any ballot."); + "Simple user is not authenticated, cannot issue any ballot." + ); } public boolean userHasAllAssurance(final List neededAssuranceList) { - return neededAssuranceList.stream().allMatch(authenticatedUserService::hasAssurance); + return neededAssuranceList.stream() + .allMatch(authenticatedUserService::hasAssurance); } } diff --git a/src/main/java/org/rulez/demokracia/pdengine/tally/Tally.java b/src/main/java/org/rulez/demokracia/pdengine/tally/Tally.java new file mode 100644 index 00000000..b8020e4e --- /dev/null +++ b/src/main/java/org/rulez/demokracia/pdengine/tally/Tally.java @@ -0,0 +1,24 @@ +package org.rulez.demokracia.pdengine.tally; + +import javax.persistence.Entity; + +import org.rulez.demokracia.pdengine.persistence.BaseEntity; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +public class Tally extends BaseEntity { + + private static final long serialVersionUID = 1L; + + private String assurance; + + public Tally(final String assurance) { + super(); + this.assurance = assurance; + } + +} diff --git a/src/main/java/org/rulez/demokracia/pdengine/tally/TallyService.java b/src/main/java/org/rulez/demokracia/pdengine/tally/TallyService.java new file mode 100644 index 00000000..4f97c8b1 --- /dev/null +++ b/src/main/java/org/rulez/demokracia/pdengine/tally/TallyService.java @@ -0,0 +1,12 @@ +package org.rulez.demokracia.pdengine.tally; + +import java.util.List; + +import org.rulez.demokracia.pdengine.votecast.CastVote; +import org.springframework.stereotype.Service; + +@Service +public interface TallyService { + + Tally calculateTally(String assurance, List castVotes); +} diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVote.java b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVote.java index d514b4f8..c798de6a 100644 --- a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVote.java +++ b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVote.java @@ -1,11 +1,16 @@ package org.rulez.demokracia.pdengine.votecalculator; import java.util.List; +import java.util.Map; + import javax.persistence.ElementCollection; import javax.persistence.Entity; + import org.rulez.demokracia.pdengine.beattable.BeatTable; import org.rulez.demokracia.pdengine.persistence.BaseEntity; +import org.rulez.demokracia.pdengine.tally.Tally; import org.rulez.demokracia.pdengine.vote.Vote; + import lombok.Getter; import lombok.Setter; @@ -20,6 +25,8 @@ public class ComputedVote extends BaseEntity { private BeatTable beatPathTable; @ElementCollection private List voteResults; + @ElementCollection + private Map tallying; public ComputedVote(final Vote vote) { super(); diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteInterface.java b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteInterface.java deleted file mode 100644 index 7bee3807..00000000 --- a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteInterface.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.rulez.demokracia.pdengine.votecalculator; - -import java.util.List; - -public interface ComputedVoteInterface { - - List computeVote(); -} diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteServiceImpl.java b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteServiceImpl.java index 7095f3aa..e245f6ce 100644 --- a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteServiceImpl.java +++ b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteServiceImpl.java @@ -1,8 +1,13 @@ package org.rulez.demokracia.pdengine.votecalculator; +import java.util.Map; +import java.util.stream.Collectors; + import org.rulez.demokracia.pdengine.beattable.BeatTable; import org.rulez.demokracia.pdengine.beattable.BeatTableService; import org.rulez.demokracia.pdengine.beattable.BeatTableTransitiveClosureService; +import org.rulez.demokracia.pdengine.tally.Tally; +import org.rulez.demokracia.pdengine.tally.TallyService; import org.rulez.demokracia.pdengine.vote.Vote; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -19,16 +24,35 @@ public class ComputedVoteServiceImpl implements ComputedVoteService { @Autowired private BeatTableTransitiveClosureService beatTableTransitiveClosureService; + @Autowired + private TallyService tallyService; + @Override public ComputedVote computeVote(final Vote vote) { - ComputedVote result = new ComputedVote(vote); - - result.setBeatTable(beatTableService.initializeBeatTable(vote.getVotesCast())); - BeatTable beatPathTable = beatTableService.normalize(result.getBeatTable()); - result.setBeatPathTable( - beatTableTransitiveClosureService.computeTransitiveClosure(beatPathTable)); - result.setVoteResults(voteResultComposer.composeResult(result.getBeatPathTable())); + final ComputedVote result = new ComputedVote(vote); + + result.setBeatTable( + beatTableService.initializeBeatTable(vote.getVotesCast()) + ); + final BeatTable beatPathTable = + beatTableService.normalize(result.getBeatTable()); + result + .setBeatPathTable( + beatTableTransitiveClosureService + .computeTransitiveClosure(beatPathTable) + ); + result.setVoteResults( + voteResultComposer.composeResult(result.getBeatPathTable()) + ); + + result.setTallying(computeTallying(vote)); return result; } + + private Map computeTallying(final Vote vote) { + return vote.getCountedAssurances().stream().map( + a -> tallyService.calculateTally(a, vote.getVotesCast()) + ).collect(Collectors.toMap(Tally::getAssurance, t -> t)); + } } diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResult.java b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResult.java index 2766086f..dee63f41 100644 --- a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResult.java +++ b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResult.java @@ -14,13 +14,15 @@ public class VoteResult extends BaseEntity { private static final long serialVersionUID = 1L; @ElementCollection - private final List choices; + private final List winners; @ElementCollection private final Map beats; - public VoteResult(final List choices, final Map beats) { + public VoteResult( + final List winners, final Map beats + ) { super(); - this.choices = choices; + this.winners = winners; this.beats = beats; } diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerImpl.java b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerImpl.java index f0ce7c4e..859e1398 100644 --- a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerImpl.java +++ b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerImpl.java @@ -26,10 +26,12 @@ public VoteResultComposerImpl() { @Override public List composeResult(final BeatTable beatTable) { - List result = new ArrayList<>(); - HashSet keyCollection = new HashSet<>(beatTable.getKeyCollection()); + final List result = new ArrayList<>(); + final HashSet keyCollection = + new HashSet<>(beatTable.getKeyCollection()); while (!ignoredSet.equals(keyCollection)) { - List winners = winnerCalculator.calculateWinners(beatTable, ignoredSet); + final List winners = + winnerCalculator.calculateWinners(beatTable, ignoredSet); result.add(createVoteResult(beatTable, winners)); ignoredSet.addAll(winners); @@ -37,31 +39,34 @@ public List composeResult(final BeatTable beatTable) { return result; } - private VoteResult createVoteResult(final BeatTable beatTable, final List winners) { + private VoteResult + createVoteResult(final BeatTable beatTable, final List winners) { return new VoteResult(winners, getBeats(winners, beatTable)); } - private Map getBeats(final List choices, - final BeatTable beatTable) { - Map result = new ConcurrentHashMap<>(); - choices.stream().forEach(c -> result.put(c, getBeatsForChoice(c, beatTable))); + private Map + getBeats(final List choices, final BeatTable beatTable) { + final Map result = new ConcurrentHashMap<>(); + choices.stream() + .forEach(c -> result.put(c, getBeatsForChoice(c, beatTable))); return result; } - private VoteResultBeat getBeatsForChoice(final String choice, final BeatTable beatTable) { - Pair zeroPair = new Pair(0, 0); - VoteResultBeat result = new VoteResultBeat(); - for (String row : beatTable.getKeyCollection()) { - Pair beat = beatTable.getElement(row, choice); - if (!zeroPair.equals(beat)) { + private VoteResultBeat + getBeatsForChoice(final String choice, final BeatTable beatTable) { + final Pair zeroPair = new Pair(0, 0); + final VoteResultBeat result = new VoteResultBeat(); + for (final String row : beatTable.getKeyCollection()) { + final Pair beat = beatTable.getElement(row, choice); + if (!zeroPair.equals(beat)) result.getBeats().put(row, beat); - } } return result; } @Override - public void setWinnerCalculator(final WinnerCalculatorService winnerCalculator) { + public void + setWinnerCalculator(final WinnerCalculatorService winnerCalculator) { this.winnerCalculator = winnerCalculator; } } diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVote.java b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVote.java index 4676bcc5..84001849 100644 --- a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVote.java +++ b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVote.java @@ -5,19 +5,22 @@ import org.rulez.demokracia.pdengine.RandomUtils; import org.rulez.demokracia.pdengine.choice.RankedChoice; - public class CastVote extends CastVoteEntity implements CastVoteInterface { + private static final long serialVersionUID = 1L; public CastVote(final String proxyId, final List preferences) { super(); - this.setProxyId(proxyId); - this.setPreferences(new ArrayList<>(preferences)); + setProxyId(proxyId); + setPreferences(new ArrayList<>(preferences)); setSecretId(RandomUtils.createRandomKey()); } - @Override - public List getAssurances() { - throw new UnsupportedOperationException(); + public CastVote( + final String proxyId, final List preferences, + final List assurances + ) { + this(proxyId, preferences); + setAssurances(assurances); } } diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteEntity.java b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteEntity.java index fc4450c5..57511e69 100644 --- a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteEntity.java +++ b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteEntity.java @@ -18,5 +18,6 @@ public class CastVoteEntity extends BaseEntity { private String proxyId; private String secretId; private String signature; + private List assurances; } diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteServiceImpl.java b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteServiceImpl.java index cf20fc78..76377500 100644 --- a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteServiceImpl.java +++ b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteServiceImpl.java @@ -4,6 +4,8 @@ import static org.rulez.demokracia.pdengine.votecast.validation.CastVoteValidationUtil.*; import java.util.List; import java.util.Objects; + +import org.rulez.demokracia.pdengine.assurance.AssuranceManager; import org.rulez.demokracia.pdengine.authentication.AuthenticatedUserService; import org.rulez.demokracia.pdengine.choice.RankedChoice; import org.rulez.demokracia.pdengine.vote.Vote; @@ -20,6 +22,9 @@ public class CastVoteServiceImpl implements CastVoteService { @Autowired private VoteService voteService; + @Autowired + private AssuranceManager assuranceManager; + @Override public CastVote castVote(final String voteId, final String ballot, final List rankedChoices) { @@ -39,13 +44,25 @@ private CastVote addCastVote(final List rankedChoices, final Vote if (Objects.nonNull(proxyId)) vote.getVotesCast().removeIf(castVote -> proxyId.equals(castVote.getProxyId())); - final CastVote castVote = new CastVote(proxyId, rankedChoices); + final CastVote castVote = createCastVote(rankedChoices, proxyId); vote.getVotesCast().add(castVote); return castVote; } - private void validateInput(final String ballot, final List rankedChoices, - final Vote vote) { + private CastVote + createCastVote( + final List rankedChoices, final String proxyId + ) { + return Objects.isNull(proxyId) ? new CastVote(proxyId, rankedChoices) : + new CastVote( + proxyId, rankedChoices, assuranceManager.getAssurances(proxyId) + ); + } + + private void validateInput( + final String ballot, final List rankedChoices, + final Vote vote + ) { checkIfVotingEnabled(vote); checkIfUpdateConditionsAreConsistent(vote, authService); validateBallot(ballot, vote); diff --git a/src/test/java/org/rulez/demokracia/pdengine/UnimplementedTests.java b/src/test/java/org/rulez/demokracia/pdengine/UnimplementedTests.java deleted file mode 100644 index d80e2bd8..00000000 --- a/src/test/java/org/rulez/demokracia/pdengine/UnimplementedTests.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.rulez.demokracia.pdengine; - -import java.util.ArrayList; -import org.junit.Test; -import org.rulez.demokracia.pdengine.annotations.TestedBehaviour; -import org.rulez.demokracia.pdengine.annotations.TestedFeature; -import org.rulez.demokracia.pdengine.annotations.TestedOperation; -import org.rulez.demokracia.pdengine.testhelpers.ThrowableTester; -import org.rulez.demokracia.pdengine.votecast.CastVote; - -@TestedFeature("Unimplemented") -@TestedOperation("Unimplemented") -@TestedBehaviour("Unimplemented") -public class UnimplementedTests extends ThrowableTester { - - @Test - public void the_getAssurances_method_is_not_implemented_yet() { - assertUnimplemented(() -> new CastVote("proxyId", new ArrayList<>()).getAssurances()); - } -} diff --git a/src/test/java/org/rulez/demokracia/pdengine/assurance/AssuranceManagerTest.java b/src/test/java/org/rulez/demokracia/pdengine/assurance/AssuranceManagerTest.java new file mode 100644 index 00000000..d0642a60 --- /dev/null +++ b/src/test/java/org/rulez/demokracia/pdengine/assurance/AssuranceManagerTest.java @@ -0,0 +1,29 @@ +package org.rulez.demokracia.pdengine.assurance; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.junit.MockitoJUnitRunner; +import org.rulez.demokracia.pdengine.annotations.TestedBehaviour; +import org.rulez.demokracia.pdengine.annotations.TestedFeature; +import org.rulez.demokracia.pdengine.annotations.TestedOperation; +import org.rulez.demokracia.pdengine.testhelpers.ThrowableTester; + +@TestedFeature("Supporting functionality") +@TestedOperation("Assurance management") +@TestedBehaviour("Unimplemented") +@RunWith(MockitoJUnitRunner.class) +public class AssuranceManagerTest extends ThrowableTester { + + private static final String PROXY_ID = "proxyId"; + + @InjectMocks + private ADAAssuranceManager assuranceManager; + + @Test + public void getAssurances_is_unimplemented_yet() throws Exception { + assertUnimplemented( + () -> assuranceManager.getAssurances(PROXY_ID) + ); + } +} diff --git a/src/test/java/org/rulez/demokracia/pdengine/testhelpers/CastVoteTestHelper.java b/src/test/java/org/rulez/demokracia/pdengine/testhelpers/CastVoteTestHelper.java index 0a102cae..f5e258a6 100644 --- a/src/test/java/org/rulez/demokracia/pdengine/testhelpers/CastVoteTestHelper.java +++ b/src/test/java/org/rulez/demokracia/pdengine/testhelpers/CastVoteTestHelper.java @@ -10,15 +10,16 @@ public class CastVoteTestHelper { public static final Choice CHOICE_A = new Choice("A", "user"); public static final Choice CHOICE_B = new Choice("B", "user"); + public static final List RANKED_CHOICES = + List.of(new RankedChoice(CHOICE_A.getId(), 1)); public static void fillVoteWithDummyCastVotes(final Vote vote) { vote.addChoice(CHOICE_A); vote.addChoice(CHOICE_B); - final List rankedChoices = List.of(new RankedChoice(CHOICE_A.getId(), 1)); - vote.getVotesCast().add(new CastVote("user1", rankedChoices)); - vote.getVotesCast().add(new CastVote("user2", rankedChoices)); - vote.getVotesCast().add(new CastVote(null, rankedChoices)); - vote.getVotesCast().add(new CastVote("user3", rankedChoices)); + vote.getVotesCast().add(new CastVote("user1", RANKED_CHOICES)); + vote.getVotesCast().add(new CastVote("user2", RANKED_CHOICES)); + vote.getVotesCast().add(new CastVote(null, RANKED_CHOICES)); + vote.getVotesCast().add(new CastVote("user3", RANKED_CHOICES)); } } diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTallyingTest.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTallyingTest.java new file mode 100644 index 00000000..c4f9f12e --- /dev/null +++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTallyingTest.java @@ -0,0 +1,40 @@ +package org.rulez.demokracia.pdengine.votecalculator; + +import static org.junit.Assert.assertTrue; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import org.rulez.demokracia.pdengine.annotations.TestedBehaviour; +import org.rulez.demokracia.pdengine.annotations.TestedFeature; +import org.rulez.demokracia.pdengine.annotations.TestedOperation; + +@TestedFeature("Vote") +@TestedOperation("Compute vote results") +@TestedBehaviour("the result contains tallying for each counted assurances") +@RunWith(MockitoJUnitRunner.class) +public class ComputedVoteTallyingTest extends ComputedVoteTestBase { + + @Override + @Before + public void setUp() { + super.setUp(); + } + + @Test + public void vote_result_contains_tally_for_each_counted_assurances() { + assertTrue( + computedVote.getTallying().keySet() + .containsAll(vote.getCountedAssurances()) + ); + } + + @Test + public void vote_result_contains_tally_only_for_counted_assurances() { + assertTrue( + vote.getCountedAssurances() + .containsAll(computedVote.getTallying().keySet()) + ); + } +} diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTest.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTest.java index b320cb43..4a0652d0 100644 --- a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTest.java +++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTest.java @@ -4,8 +4,10 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; import static org.rulez.demokracia.pdengine.testhelpers.BeatTableTestHelper.*; + import java.util.List; import java.util.Set; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -46,29 +48,36 @@ public class ComputedVoteTest { public void setUp() { when(beatTableService.initializeBeatTable(any())) .thenReturn(createNewBeatTableWithComplexData()); - List keys = List.of("A", "B", "C", "D"); - when(beatTableService.normalize(any())).thenReturn(createTransitiveClosedBeatTable(keys)); + final List keys = List.of("A", "B", "C", "D"); + when(beatTableService.normalize(any())) + .thenReturn(createTransitiveClosedBeatTable(keys)); when(beatTableTransitiveClosureService.computeTransitiveClosure(any())) .thenReturn(createTransitiveClosedBeatTable(keys)); when(voteResultComposer.composeResult(any())) .thenReturn(VoteResultTestHelper.createVoteResults()); - VariantVote vote = new VariantVote(); - vote.setVotesCast(List.of(new CastVote(RandomUtils.createRandomKey(), List.of()))); + final VariantVote vote = new VariantVote(); + vote.setVotesCast( + List.of(new CastVote(RandomUtils.createRandomKey(), List.of())) + ); computedVote = computedVoteService.computeVote(vote); } @TestedBehaviour("compares and stores initial beat matrix") @Test public void compute_vote_should_create_initial_matrix_with_full_key_set() { - assertEquals(Set.of("name1", "name2", "name3"), - Set.copyOf(computedVote.getBeatTable().getKeyCollection())); + assertEquals( + Set.of("name1", "name2", "name3"), + Set.copyOf(computedVote.getBeatTable().getKeyCollection()) + ); } @TestedBehaviour("compares and stores initial beat matrix") @Test public void after_compute_vote_beat_table_should_contain_beat_information() { - assertBeatTableEquals(computedVote.getBeatTable(), createNewBeatTableWithComplexData()); + assertBeatTableEquals( + computedVote.getBeatTable(), createNewBeatTableWithComplexData() + ); } @TestedBehaviour("calculates and stores beatpath matrix") @@ -86,7 +95,9 @@ public void beat_path_matrix_is_normalized() { @TestedBehaviour("calculates and stores beatpath matrix") @Test public void transitive_closure_done_on_beat_path_matrix() { - assertBeatTableEquals(createTransitiveClosedBeatTable(), computedVote.getBeatPathTable()); + assertBeatTableEquals( + createTransitiveClosedBeatTable(), computedVote.getBeatPathTable() + ); } @TestedBehaviour("calculates and stores vote results") @@ -95,18 +106,24 @@ public void vote_results_stored_in_computed_vote() { assertFalse(computedVote.getVoteResults().isEmpty()); } - private void assertBeatTableEquals(final BeatTable firstBeatTable, - final BeatTable secondBeatTable) { - for (String choice1 : firstBeatTable.getKeyCollection()) - for (String choice2 : firstBeatTable.getKeyCollection()) - assertEquals(secondBeatTable.getElement(choice1, choice2), - firstBeatTable.getElement(choice1, choice2)); + private void assertBeatTableEquals( + final BeatTable firstBeatTable, final BeatTable secondBeatTable + ) { + for (final String choice1 : firstBeatTable.getKeyCollection()) + for (final String choice2 : firstBeatTable.getKeyCollection()) + assertEquals( + secondBeatTable.getElement(choice1, choice2), firstBeatTable.getElement(choice1, choice2) + ); } - @TestedBehaviour("vote result includes the votes cast with the secret cast vote identifier.") + @TestedBehaviour( + "vote result includes the votes cast with the secret cast vote identifier." + ) @Test - public void vote_result_includes_the_votes_cast_with_the_secret_cast_vote_id() { - String secretId = computedVote.getVote().getVotesCast().get(0).getSecretId(); + public void + vote_result_includes_the_votes_cast_with_the_secret_cast_vote_id() { + final String secretId = + computedVote.getVote().getVotesCast().get(0).getSecretId(); assertFalse(secretId.isEmpty()); } } diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTestBase.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTestBase.java new file mode 100644 index 00000000..44c1526b --- /dev/null +++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTestBase.java @@ -0,0 +1,65 @@ +package org.rulez.demokracia.pdengine.votecalculator; + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; +import static org.rulez.demokracia.pdengine.testhelpers.BeatTableTestHelper.*; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.rulez.demokracia.pdengine.RandomUtils; +import org.rulez.demokracia.pdengine.beattable.BeatTableService; +import org.rulez.demokracia.pdengine.beattable.BeatTableTransitiveClosureService; +import org.rulez.demokracia.pdengine.tally.Tally; +import org.rulez.demokracia.pdengine.tally.TallyService; +import org.rulez.demokracia.pdengine.testhelpers.VoteResultTestHelper; +import org.rulez.demokracia.pdengine.vote.Vote; +import org.rulez.demokracia.pdengine.votecast.CastVote; + +public class ComputedVoteTestBase { + + @InjectMocks + protected ComputedVoteServiceImpl computedVoteService; + + @Mock + protected BeatTableService beatTableService; + + @Mock + protected BeatTableTransitiveClosureService beatTableTransitiveClosureService; + + @Mock + protected VoteResultComposer voteResultComposer; + + @Mock + protected TallyService tallyService; + + protected ComputedVote computedVote; + + protected Vote vote; + + @Before + public void setUp() { + when(beatTableService.initializeBeatTable(any())) + .thenReturn(createNewBeatTableWithComplexData()); + final List keys = List.of("A", "B", "C", "D"); + when(beatTableService.normalize(any())) + .thenReturn(createTransitiveClosedBeatTable(keys)); + when(beatTableTransitiveClosureService.computeTransitiveClosure(any())) + .thenReturn(createTransitiveClosedBeatTable(keys)); + when(voteResultComposer.composeResult(any())) + .thenReturn(VoteResultTestHelper.createVoteResults()); + when(tallyService.calculateTally(anyString(), any())) + .then(a -> new Tally((String) a.getArgument(0))); + + vote = new Vote( + "name", new ArrayList<>(), List.of("hun", "ger", "eng"), false, 1 + ); + vote.setVotesCast( + List.of(new CastVote(RandomUtils.createRandomKey(), List.of())) + ); + computedVote = computedVoteService.computeVote(vote); + } +} diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerTest.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerTest.java index a105265f..2fa5e84f 100644 --- a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerTest.java +++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerTest.java @@ -3,14 +3,14 @@ import static org.junit.Assert.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; + import java.util.List; import java.util.Set; import java.util.stream.Collectors; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.rulez.demokracia.pdengine.annotations.TestedBehaviour; import org.rulez.demokracia.pdengine.annotations.TestedFeature; @@ -21,24 +21,19 @@ @TestedOperation("Compute vote results") @TestedBehaviour("the winners list contains the looses to the first one") @RunWith(MockitoJUnitRunner.class) -public class VoteResultComposerTest { - - @InjectMocks - private VoteResultComposerImpl voteResultComposer; - @Mock - private WinnerCalculatorService winnerCalculatorService; - - private Set choicesReturned; - private Set keySetOfInitialBeatTable; - private List result; +public class VoteResultComposerTest extends VoteResultTestBase { @Before + @Override public void setUp() { - when(winnerCalculatorService.calculateWinners(any(), any())).thenReturn(List.of("A", "B")) + when(winnerCalculatorService.calculateWinners(any(), any())) + .thenReturn(List.of("A", "B")) .thenReturn(List.of("C")).thenReturn(List.of("D")); result = - voteResultComposer.composeResult(BeatTableTestHelper.createTransitiveClosedBeatTable()); + voteResultComposer.composeResult( + BeatTableTestHelper.createTransitiveClosedBeatTable() + ); choicesReturned = convertResultToChoiceSet(result); keySetOfInitialBeatTable = Set.of("A", "B", "C", "D"); @@ -51,25 +46,29 @@ public void compute_vote_results_returns_every_choice() { @Test public void compute_vote_results_returns_each_choices_once() { - List keyList = result.stream().map(VoteResult::getChoices).flatMap(List::stream) + final List keyList = result.stream().map(VoteResult::getWinners) + .flatMap(List::stream) .collect(Collectors.toList()); assertEquals(keyList.size(), choicesReturned.size()); } @Test public void compute_vote_results_assigns_no_beat_to_winners() { - int winnersLoses = getNumberOfBeats(result.get(0)); + final int winnersLoses = getNumberOfBeats(result.get(0)); assertEquals(0, winnersLoses); } @Test public void compute_vote_results_return_nonzero_loses_for_nonwinners() { - for (VoteResult choiceMap : result.subList(1, result.size())) + for (final VoteResult choiceMap : result.subList(1, result.size())) assertEachChoiceHaveBeaten(choiceMap); } private void assertEachChoiceHaveBeaten(final VoteResult voteResult) { - assertTrue(voteResult.getBeats().values().stream().allMatch(m -> !m.getBeats().isEmpty())); + assertTrue( + voteResult.getBeats().values().stream() + .allMatch(m -> !m.getBeats().isEmpty()) + ); } private Integer getNumberOfBeats(final VoteResult voteResult) { @@ -78,7 +77,8 @@ private Integer getNumberOfBeats(final VoteResult voteResult) { } private Set convertResultToChoiceSet(final List result) { - return result.stream().map(voteResult -> voteResult.getChoices()).flatMap(List::stream) + return result.stream().map(voteResult -> voteResult.getWinners()) + .flatMap(List::stream) .collect(Collectors.toSet()); } } diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultTestBase.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultTestBase.java new file mode 100644 index 00000000..53544f28 --- /dev/null +++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultTestBase.java @@ -0,0 +1,45 @@ +package org.rulez.demokracia.pdengine.votecalculator; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.junit.Before; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.rulez.demokracia.pdengine.testhelpers.BeatTableTestHelper; + +public class VoteResultTestBase { + + @InjectMocks + protected VoteResultComposerImpl voteResultComposer; + @Mock + protected WinnerCalculatorService winnerCalculatorService; + + protected Set choicesReturned; + protected Set keySetOfInitialBeatTable; + protected List result; + + @Before + public void setUp() { + when(winnerCalculatorService.calculateWinners(any(), any())) + .thenReturn(List.of("A", "B")) + .thenReturn(List.of("C")) + .thenReturn(List.of("D")); + + result = voteResultComposer + .composeResult(BeatTableTestHelper.createTransitiveClosedBeatTable()); + choicesReturned = convertResultToChoiceSet(result); + keySetOfInitialBeatTable = Set.of("A", "B", "C", "D"); + } + + private Set convertResultToChoiceSet(final List result) { + return result.stream() + .map(VoteResult::getWinners) + .flatMap(List::stream) + .collect(Collectors.toSet()); + } +} diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultWinnerListTest.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultWinnerListTest.java new file mode 100644 index 00000000..34347553 --- /dev/null +++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultWinnerListTest.java @@ -0,0 +1,43 @@ +package org.rulez.demokracia.pdengine.votecalculator; + +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import org.rulez.demokracia.pdengine.annotations.TestedBehaviour; +import org.rulez.demokracia.pdengine.annotations.TestedFeature; +import org.rulez.demokracia.pdengine.annotations.TestedOperation; + +@TestedFeature("Vote") +@TestedOperation("Compute vote results") +@TestedBehaviour("calculates and stores winner list") +@RunWith(MockitoJUnitRunner.class) +public class VoteResultWinnerListTest extends VoteResultTestBase { + + @Before + @Override + public void setUp() { + super.setUp(); + } + + @Test + public void vote_result_contains_winners_list() { + final List> expectedWinners = + List.of(List.of("A", "B"), List.of("C"), List.of("D")); + assertAllVoteResultContainsWinners(expectedWinners, result); + } + + private void assertAllVoteResultContainsWinners( + final List> expectedWinners, final List result + ) { + for (int i = 0; i < result.size(); ++i) + assertTrue( + result.get(i).getWinners().containsAll(expectedWinners.get(i)) + ); + } + +} diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteAssuranceTest.java b/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteAssuranceTest.java new file mode 100644 index 00000000..fd53f4c5 --- /dev/null +++ b/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteAssuranceTest.java @@ -0,0 +1,53 @@ +package org.rulez.demokracia.pdengine.votecast; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.when; +import static org.rulez.demokracia.pdengine.testhelpers.CastVoteTestHelper.RANKED_CHOICES; + +import java.util.Objects; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import org.rulez.demokracia.pdengine.annotations.TestedBehaviour; +import org.rulez.demokracia.pdengine.annotations.TestedFeature; +import org.rulez.demokracia.pdengine.annotations.TestedOperation; + +@TestedFeature("Supporting functionality") +@TestedOperation("CastVote") +@RunWith(MockitoJUnitRunner.class) +public class CastVoteAssuranceTest extends CastVoteTestBase { + + @Override + @Before + public void setUp() { + super.setUp(); + when(authService.getAuthenticatedUserName()).thenReturn(USER_NAME); + when(assuranceManager.getAssurances(USER_NAME)) + .thenReturn(ASSURANCES); + } + + @TestedBehaviour( + "The assurances of the voter can be obtained from a cast vote if canupdateis true" + ) + @Test + public void + the_assurances_of_the_voter_can_be_obtained_from_a_cast_vote_if_canupdate_is_true() { + vote.getParameters().setUpdatable(true); + final CastVote castVote = castVoteService + .castVote(vote.getId(), ballot, RANKED_CHOICES); + assertEquals(ASSURANCES, castVote.getAssurances()); + } + + @TestedBehaviour( + "The assurances of the voter can be obtained from a cast vote if canupdateis true" + ) + @Test + public void the_assurances_of_the_voter_is_null_if_canupdate_is_false() { + vote.getParameters().setUpdatable(false); + final CastVote castVote = castVoteService + .castVote(vote.getId(), ballot, RANKED_CHOICES); + assertTrue(Objects.isNull(castVote.getAssurances())); + } +} diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteTestBase.java b/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteTestBase.java index 1c767946..07bac973 100644 --- a/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteTestBase.java +++ b/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteTestBase.java @@ -1,10 +1,14 @@ package org.rulez.demokracia.pdengine.votecast; import static org.mockito.Mockito.when; + +import java.util.List; + import org.apache.catalina.connector.CoyotePrincipal; import org.junit.Before; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.rulez.demokracia.pdengine.assurance.AssuranceManager; import org.rulez.demokracia.pdengine.authentication.AuthenticatedUserService; import org.rulez.demokracia.pdengine.testhelpers.CastVoteTestHelper; import org.rulez.demokracia.pdengine.testhelpers.ThrowableTester; @@ -14,6 +18,10 @@ public class CastVoteTestBase extends ThrowableTester { + protected static final String USER_NAME = "name"; + + protected static final List ASSURANCES = List.of("madjare", "inglis"); + @InjectMocks protected CastVoteServiceImpl castVoteService; @@ -21,6 +29,8 @@ public class CastVoteTestBase extends ThrowableTester { protected VoteService voteService; @Mock protected AuthenticatedUserService authService; + @Mock + protected AssuranceManager assuranceManager; protected Vote vote = new VariantVote(); @@ -29,7 +39,8 @@ public class CastVoteTestBase extends ThrowableTester { @Before public void setUp() { when(voteService.getVote(vote.getId())).thenReturn(vote); - when(authService.getUserPrincipal()).thenReturn(new CoyotePrincipal("name")); + when(authService.getUserPrincipal()) + .thenReturn(new CoyotePrincipal(USER_NAME)); vote.getParameters().setVotable(true); vote.getParameters().setUpdatable(true); CastVoteTestHelper.fillVoteWithDummyCastVotes(vote); diff --git a/tools/check_mergebuild_enable b/tools/check_mergebuild_enable deleted file mode 100755 index 9f8fbb29..00000000 --- a/tools/check_mergebuild_enable +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/python3 - -import urllib.request -import os -import sys -import json - -pullrequest=os.environ['PULL_REQUEST'] -commit=os.environ['COMMIT'][:7] -comitter=os.environ['COMMITTER'] -print(dict(pull=pullrequest,commit=commit,comitter=comitter)) -authorized_users= [ - 'magwas', - 'gypeng', - 'utopszkij', -] -if pullrequest == "false": - sys.exit(0) -if comitter in authorized_users: - sys.exit(0) -uri = "https://api.github.com/repos/edemo/PDEngine/issues/{0}/comments".format(pullrequest) -print(uri) -stuff = urllib.request.urlopen(uri).read() -comments=json.loads(stuff.decode('utf-8')) -for comment in comments: - commentuser = comment['user']['login'] - if commentuser in authorized_users: - commentbody = comment['body'] - print("comment from "+commentuser+": "+commentbody) - print("checking for "+commit) - if ("can_build" in commentbody) and (commit in commentbody): - sys.exit(0) - -print("the pull request cannot be built until an authorized user does not comment 'can_build "+commit+"'") -print("authorized users:") -print(authorized_users) -sys.exit(-1) - diff --git a/tools/countTestcases b/tools/countTestcases deleted file mode 100755 index e5e6cb71..00000000 --- a/tools/countTestcases +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/python - -import sys -import json -import urllib -import re -import argparse - -parser = argparse.ArgumentParser(description="Tool for list dev's completed tasks with implemented test case count.") -parser.add_argument('user', help='Repository owner Github user') -parser.add_argument('repo', help='Name of Github repo') -parser.add_argument('token', help='Access token') -parser.add_argument('developer', help='Github user name of the developer') -parser.add_argument('-l', '--last-billed', help='Last billed pull request number', default=0, type=int) -args = parser.parse_args(); - -def isUser(developer, userToMatch): - return userToMatch is not None and developer == userToMatch['login'] - -def getJSONContent(uri): - request = urllib.urlopen(uri) - return json.loads(request.read() if request.getcode() == 200 else "[]") - -def uriWithToken(uri, token): - return "{0}?access_token={1}".format(uri, token) - -def getTestCaseCountFromComments(uri): - comments = getJSONContent(uri) - for comment in comments: - match = re.match(r".*testcase\w*\s*=\s*(\d+)", comment['body'], re.DOTALL | re.IGNORECASE) - if match is not None: - return match.group(1) - -def getTestcaseCount(commentsUri, reviewsUri, token): - return getTestCaseCountFromComments(uriWithToken(commentsUri, token)) or getTestCaseCountFromComments(uriWithToken(reviewsUri, token)) - -def reviewsUrl(user, repo, pullId): - return "https://api.github.com/repos/{0}/{1}/pulls/{2}/reviews".format(user, repo, pullId); - -def issuesUrl(user, repo, developer, token): - return "https://api.github.com/search/issues?q=user:{0}+repo:{1}+author:{2}+state:closed+type:pr+review:approved&sort=number&order=desc&access_token={3}".format(user, repo, developer, token) - - -print "Description | PR number | Test case count" -sumTests = 0 -issuesUri = issuesUrl(args.user, args.repo, args.developer, args.token) -issues = filter(lambda i: int(i['number']) > args.last_billed, getJSONContent(issuesUri)['items']) -for issue in issues: - testCaseCount = getTestcaseCount(issue['comments_url'], reviewsUrl(args.user, args.repo, issue['number']), args.token) - print "{0} | {1} | {2}".format(issue['title'], issue['number'], testCaseCount) - sumTests += int(testCaseCount or 0) - -print "\nSum Test Cases: ", sumTests diff --git a/tools/entrypoint b/tools/entrypoint deleted file mode 100755 index dd004c5e..00000000 --- a/tools/entrypoint +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -set -xe - -rm /dev/random -cp -a /dev/urandom /dev/random; -groupadd -g ${DEVGID} developer -useradd -u ${DEVUID} -g ${DEVGID} -G sudo -d /home/developer developer -chown ${DEVUID}:${DEVGID} /home/developer -if [ ! -d /home/developer/.m2 ] -then - cp -r /root/.m2 /home/developer - chown -R developer.developer /home/developer -fi - -export HOME=/home/developer -exec sudo -u developer "$@" diff --git a/tools/generate_keystore b/tools/generate_keystore deleted file mode 100755 index 7426dc26..00000000 --- a/tools/generate_keystore +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -set -xe -me=$(readlink -f "$0") -pdedir=$(dirname $(dirname "$me")) -KEYSTOREDIR=$pdedir/target/test-classes/resources -KEYSTOREFILE=keystore.pk12 -mkdir -p $KEYSTOREDIR -cd $KEYSTOREDIR || exit 1 -if [ ! -f "$KEYSTOREFILE" ] -then - SUBJ="/C=HU/ST=Pest/L=Hungary/O=Kozossegi Digitalis Eszkozok Alapitvany/OU=Org/CN=*.demokracia.rulez.org" - KEYSTOREPASS="changeit" - ALIAS="PDEngineKeys" - PRIVKEYFILE=selfsigned.key - CERTFILE=selfsigned.crt - openssl req -x509 -newkey rsa:2048 -keyout $PRIVKEYFILE -out $CERTFILE -days 365 -nodes -subj "$SUBJ" - openssl pkcs12 -name "$ALIAS" -export -in $CERTFILE -inkey $PRIVKEYFILE -out $KEYSTOREFILE -passout pass:"$KEYSTOREPASS" - rm $PRIVKEYFILE $CERTFILE - chmod og-r-w-x $KEYSTOREFILE -fi -ls -l $KEYSTOREDIR/$KEYSTOREFILE diff --git a/tools/generate_secret_env b/tools/generate_secret_env deleted file mode 100755 index 817e5306..00000000 --- a/tools/generate_secret_env +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -if [ $# -eq 0 ] -then - echo "usage: $0 " - echo "expects the ssh pubkey at ~/.ssh/shippable..pub" - exit 1 -fi -set -xe -mkdir -p ~/tmp -KEYFILE=etc/secrets/key.$1 -PASSFILE=~/tmp/secret.data -openssl rand 192 -out $PASSFILE -openssl aes-256-cbc -in ~/.ssh/shippable.PDEngine.env -out etc/secrets/shippable.env.$1.encrypted -pass file:$PASSFILE -openssl rsautl -encrypt -pubin -inkey <(ssh-keygen -e -f ~/.ssh/shippable.$1.pub -m PKCS8) -in $PASSFILE -out $KEYFILE -rm -f $PASSFILE diff --git a/tools/getGithubIssues b/tools/getGithubIssues deleted file mode 100755 index bc2a436c..00000000 --- a/tools/getGithubIssues +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/python - -import sys -import json -import urllib -import re - -user=sys.argv[1] -repo=sys.argv[2] -token=sys.argv[3] - -def getLinksFromBody(body): - return re.findall(r"\[(?P[^[]*)\]\((?P[^)]*)",body) - -def printIssue(issue): - print ' '.format( - issue['id'], - issue['state'].encode('utf-8'), - issue['html_url']) - print ' {0}'.format( - issue['title'].encode('utf-8')) - body=issue['body'] - links = getLinksFromBody(body) - for link in links: - print ' '.format( - link[1].encode('utf-8'), - link[0].encode('utf-8')) - print "" - -pageNumber = 1 -print "" -while True: - issuesUri="https://api.github.com/repos/{0}/{1}/issues?state=all&page={2}&access_token={3}".format(user,repo,pageNumber,token) - page = urllib.urlopen(issuesUri) - content = page.read() - issues = json.loads(content) - if len(issues) == 0: - break - for issue in issues: - printIssue(issue) - pageNumber += 1 - -print "" diff --git a/tools/getbranch b/tools/getbranch deleted file mode 100755 index 535187de..00000000 --- a/tools/getbranch +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -a=$(git rev-parse --abbrev-ref HEAD) -if [ $a == HEAD ] -then - echo $BRANCH -else - echo $a -fi - diff --git a/tools/prepare b/tools/prepare deleted file mode 100755 index f89f4492..00000000 --- a/tools/prepare +++ /dev/null @@ -1,16 +0,0 @@ -set -x -export DISPLAY=:0 -if [ -a /tmp/.X11-unix/X0 ] -then - echo skipping X server -else - Xvnc4 -SecurityTypes none -localhost :0 & -fi -#!!!do not do it on a production system!!! -#run haveged instead -sudo rm /dev/random -sudo cp -a /dev/urandom /dev/random -#end of workaround for low entropy level -export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/ -set |sed 's/=[a-z0-9].*/=EXISTS/' -ls -l /usr/lib/jvm/*/bin/java diff --git a/tools/publish b/tools/publish deleted file mode 100755 index efafbd46..00000000 --- a/tools/publish +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -repo=$(git remote -v|grep "origin.*fetch"|sed 'sA^.*github.com/AA;sA/.*AA') -rsync -e "ssh -p 22022" -ar shippable/ shippable@demokracia.rulez.org:/var/www/adadocs/PDEngine/$repo/$BUILD_NUMBER -normalized_branch=$(echo $BRANCH|sed 'sA[/_]A.Ag') -ln -s $BUILD_NUMBER $normalized_branch -rsync -e "ssh -p 22022" -a $normalized_branch shippable@demokracia.rulez.org:/var/www/adadocs/PDEngine/$repo - diff --git a/tools/pullanalize b/tools/pullanalize deleted file mode 100755 index 45a327cc..00000000 --- a/tools/pullanalize +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -set -xe -function normalize_branch_name_for_sonar() { - echo "${1}" |sed 's/[^A-Za-z0-9/.-]/_/g' -} - -echo PULL REQUEST $PULL_REQUEST -BASE_BRANCH=$(normalize_branch_name_for_sonar "${BASE_BRANCH}") -HEAD_BRANCH=$(normalize_branch_name_for_sonar "${HEAD_BRANCH}") -BRANCH=$(normalize_branch_name_for_sonar "${BRANCH}") -if [ $PULL_REQUEST != false ] -then - mvn sonar:sonar -Dsonar.organization=edemo\ - -Dsonar.pullrequest.provider=github\ - -Dsonar.pullrequest.github.repository=${REPO_FULL_NAME} \ - -Dsonar.pullrequest.branch=${HEAD_BRANCH}\ - -Dsonar.pullrequest.key=${PULL_REQUEST}\ - -Dsonar.pullrequest.base=${BASE_BRANCH}\ - -Dsonar.github.oauth=${GITHUB_OAUTH}\ - -Dsonar.github.repository=${REPO_FULL_NAME}\ - -Dsonar.issuesReport.console.enable=true\ - -Dsonar.github.login=magwas\ - -Dsonar.externalIssuesReportPaths=issuesReport.json\ - -Dsonar.java.pmd.reportPaths=target/pmd_full.xml\ - -Dsonar.tests=src/test,src/integration-test\ - -Pintegration-test -else - mvn sonar:sonar -Dsonar.organization=edemo\ - -Dsonar.java.pmd.reportPaths=target/pmd_full.xml\ - -Dsonar.branch.name=${BRANCH}\ - -Dsonar.externalIssuesReportPaths=issuesReport.json\ - -Dsonar.tests=src/test,src/integration-test\ - -Pintegration-test -fi diff --git a/tools/script b/tools/script deleted file mode 100755 index 5cd1944a..00000000 --- a/tools/script +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -set -xe -. tools/prepare -make diff --git a/tools/setenv b/tools/setenv deleted file mode 100644 index 2a771425..00000000 --- a/tools/setenv +++ /dev/null @@ -1,9 +0,0 @@ -export DISPLAY=:0 -export PATH=$PATH:~/bin -GITUSER=$(git -C /build/ remote -v |grep origin|head -1|sed 's/^.*://;sA/.*AA') -GITCOMMIT=$(git -C /build/ rev-parse HEAD) -export REPO_FULL_NAME=home/$GITUSER -export HEAD_BRANCH=home/$GITUSER -export PULL_REQUEST=$GITCOMMIT -export BASE_BRANCH=develop - diff --git a/tools/testenv b/tools/testenv index d25f3e37..22021c81 100755 --- a/tools/testenv +++ b/tools/testenv @@ -12,7 +12,7 @@ then PORTMAP="" fi -docker run --rm $PORTMAP -e PULL_REQUEST=false -e DEVUID=${DEV_UID} -e DEVGID=${DEV_GID} -e ORG_NAME=local \ +docker run --rm $PORTMAP -e PULL_REQUEST=false -e DEVUID=${DEV_UID} -e DEVGID=${DEV_GID} -e ORG_NAME=local -e issuetoken=${issuetoken} -e sonarkey=${sonarkey}\ -v $(pwd):/build -v ${DEVHOME}:/home/developer -v /tmp/.X11-unix:/tmp/.X11-unix \ -w /build -it ${PDENGINE_IMAGE} diff --git a/workbench.xmi b/workbench.xmi deleted file mode 100644 index ef483d4a..00000000 --- a/workbench.xmi +++ /dev/null @@ -1,1310 +0,0 @@ - - - - activeSchemeId:org.rulez.magwas.zenta.editor.keybindings - ModelMigrationProcessor.001 - - - - - - - - topLevel - - - - persp.actionSet:org.rulez.magwas.zenta.templates.actionSet - - - - active - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - View - categoryTag:Help - - - View - categoryTag:General - - - View - categoryTag:Help - - - - org.eclipse.e4.primaryDataStack - EditorStack - - - - - View - categoryTag:Other - active - activeOnClose - - ViewMenu - menuContribution:menu - - - - - - View - categoryTag:Other - - ViewMenu - menuContribution:menu - - - - - - View - categoryTag:General - - ViewMenu - menuContribution:menu - - - - - View - categoryTag:Other - - - View - categoryTag:General - - - View - categoryTag:Other - - - - Draggable - - - Draggable - - - Draggable - - - toolbarSeparator - - - - toolbarSeparator - - - - stretch - SHOW_RESTORE_MENU - - - - - stretch - - - Draggable - - - Draggable - - - - - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - platform:gtk - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - platform:gtk - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - schemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - - - - - - - - - - - - - Editor - - - View - categoryTag:General - - - View - categoryTag:Help - - - View - categoryTag:General - - - View - categoryTag:Help - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:Other - - - View - categoryTag:Other - - - View - categoryTag:Other - - - View - categoryTag:Other - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -