From e524e5558d7ae0410254c44c304560be6b22394f Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Mon, 6 May 2019 14:18:02 +0100 Subject: [PATCH 1/7] Add more test fixtures --- tests/fixtures/contributions.js | 18 ++++++++++++++++++ tests/fixtures/contributors.js | 6 +++--- 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 tests/fixtures/contributions.js diff --git a/tests/fixtures/contributions.js b/tests/fixtures/contributions.js new file mode 100644 index 0000000..1d92d92 --- /dev/null +++ b/tests/fixtures/contributions.js @@ -0,0 +1,18 @@ +import Model from 'kredits-web/models/contribution'; + +const items = []; + +const data = [ + { id: 1, contributorId: 1, confirmedAtBlock: 1000, claimed: false, vetoed: false, amount: 1500 }, + { id: 2, contributorId: 1, confirmedAtBlock: 1000, claimed: false, vetoed: false, amount: 5000 }, + { id: 3, contributorId: 2, confirmedAtBlock: 1000, claimed: false, vetoed: false, amount: 1500 }, + { id: 4, contributorId: 2, confirmedAtBlock: 1000, claimed: false, vetoed: false, amount: 1500 }, + { id: 5, contributorId: 1, confirmedAtBlock: 1000, claimed: false, vetoed: false, amount: 5000 }, + { id: 6, contributorId: 3, confirmedAtBlock: 2000, claimed: false, vetoed: false, amount: 5000 }, + { id: 7, contributorId: 1, confirmedAtBlock: 2000, claimed: false, vetoed: false, amount: 1500 }, + { id: 8, contributorId: 3, confirmedAtBlock: 2000, claimed: false, vetoed: true, amount: 1500 }, +]; + +data.forEach(attrs => items.push(Model.create(attrs))); + +export default items; diff --git a/tests/fixtures/contributors.js b/tests/fixtures/contributors.js index 12f8f40..a8f24b0 100644 --- a/tests/fixtures/contributors.js +++ b/tests/fixtures/contributors.js @@ -3,9 +3,9 @@ import Contributor from 'kredits-web/models/contributor'; const contributors = []; const data = [ - { id: 1, name: 'Bumi', totalKreditsEarned: 5500 }, - { id: 2, name: 'Râu Cao', totalKreditsEarned: 1500 }, - { id: 3, name: 'Manuel', totalKreditsEarned: 3000 } + { id: 1, name: 'Bumi', totalKreditsEarned: 11500 }, + { id: 2, name: 'Râu Cao', totalKreditsEarned: 3000 }, + { id: 3, name: 'Manuel', totalKreditsEarned: 0 } ]; data.forEach(attrs => contributors.push(Contributor.create(attrs))); From 82b275caaa6eedf7349dcd920dadcb20e8fd4174 Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Mon, 6 May 2019 14:18:41 +0100 Subject: [PATCH 2/7] Add some unit tests for kredits service --- tests/unit/services/kredits-test.js | 48 +++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/tests/unit/services/kredits-test.js b/tests/unit/services/kredits-test.js index 6909c1d..d3e1e00 100644 --- a/tests/unit/services/kredits-test.js +++ b/tests/unit/services/kredits-test.js @@ -1,12 +1,54 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; +import contributors from '../../fixtures/contributors'; +import contributions from '../../fixtures/contributions'; module('Unit | Service | kredits', function(hooks) { setupTest(hooks); - // Replace this with your real tests. - test('it exists', function(assert) { + test('#contributionsConfirmed', function(assert) { let service = this.owner.lookup('service:kredits'); - assert.ok(service); + service.set('contributions', contributions); + service.set('currentBlock', 1023); + + const items = service.contributionsConfirmed; + assert.equal(items.length, 5); + }); + + test('#contributionsUnconfirmed', function(assert) { + let service = this.owner.lookup('service:kredits'); + service.set('contributions', contributions); + service.set('currentBlock', 1023); + + const items = service.contributionsUnconfirmed; + assert.equal(items.length, 3); + }); + + test('#kreditsByContributor', function(assert) { + let service = this.owner.lookup('service:kredits'); + service.set('contributors', contributors); + service.set('contributions', contributions); + service.set('currentBlock', 1023); + + const kreditsByContributor = service.kreditsByContributor; + + console.log(kreditsByContributor); + + // assert.equal(kreditsByContributor.length, 3, 'includes all contributors with confirmed kredits'); + + const c1 = kreditsByContributor.find(k => k.contributor.id == 1); + assert.equal(c1.amountConfirmed, 11500, 'correct amount confirmed'); + assert.equal(c1.amountUnconfirmed, 1500, 'correct amount unconfirmed'); + assert.equal(c1.amountTotal, 13000, 'correct amount total'); + + // const c2 = kreditsByContributor.find(k => k.contributor.id == 2); + // assert.equal(c1.amountConfirmed, 5500, 'correct amount confirmed'); + // assert.equal(c1.amountUnconfirmed, 1500, 'correct amount unconfirmed'); + // assert.equal(c1.amountTotal, 7000, 'correct amount total'); + + const c3 = kreditsByContributor.find(k => k.contributor.id == 3); + assert.equal(c3.amountConfirmed, 0, 'correct amount confirmed'); + assert.equal(c3.amountUnconfirmed, 6500, 'correct amount unconfirmed'); + assert.equal(c3.amountTotal, 6500, 'correct amount total'); }); }); From f86c53de89a086a247f67b5d6c7c71582d2ae038 Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Mon, 6 May 2019 14:22:04 +0100 Subject: [PATCH 3/7] Add failing test for missing contributors in toplist --- tests/unit/services/kredits-test.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/unit/services/kredits-test.js b/tests/unit/services/kredits-test.js index d3e1e00..da06057 100644 --- a/tests/unit/services/kredits-test.js +++ b/tests/unit/services/kredits-test.js @@ -34,17 +34,17 @@ module('Unit | Service | kredits', function(hooks) { console.log(kreditsByContributor); - // assert.equal(kreditsByContributor.length, 3, 'includes all contributors with confirmed kredits'); + assert.equal(kreditsByContributor.length, 3, 'includes all contributors with confirmed kredits'); const c1 = kreditsByContributor.find(k => k.contributor.id == 1); assert.equal(c1.amountConfirmed, 11500, 'correct amount confirmed'); assert.equal(c1.amountUnconfirmed, 1500, 'correct amount unconfirmed'); assert.equal(c1.amountTotal, 13000, 'correct amount total'); - // const c2 = kreditsByContributor.find(k => k.contributor.id == 2); - // assert.equal(c1.amountConfirmed, 5500, 'correct amount confirmed'); - // assert.equal(c1.amountUnconfirmed, 1500, 'correct amount unconfirmed'); - // assert.equal(c1.amountTotal, 7000, 'correct amount total'); + const c2 = kreditsByContributor.find(k => k.contributor.id == 2); + assert.equal(c2.amountConfirmed, 3000, 'correct amount confirmed'); + assert.equal(c2.amountUnconfirmed, 0, 'correct amount unconfirmed'); + assert.equal(c2.amountTotal, 3000, 'correct amount total'); const c3 = kreditsByContributor.find(k => k.contributor.id == 3); assert.equal(c3.amountConfirmed, 0, 'correct amount confirmed'); From ef45d55521caff7b67bb71a50c58dc5c99ae574f Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Mon, 6 May 2019 14:44:42 +0100 Subject: [PATCH 4/7] Fix missing contributors in toplist Adds contributors without unconfirmed contributions to the kreditsByContributor collection. fixes #114 --- app/services/kredits.js | 19 +++++++++++++++++-- tests/unit/services/kredits-test.js | 2 -- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/services/kredits.js b/app/services/kredits.js index 15bb528..7064819 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -46,18 +46,33 @@ export default Service.extend({ }), kreditsByContributor: computed('contributionsUnconfirmed.[]', 'contributors', function() { - const contributionsGrouped = groupBy(this.contributionsUnconfirmed, 'contributorId'); + const contributionsUnconfirmed = this.contributionsUnconfirmed; + const contributionsGrouped = groupBy(contributionsUnconfirmed, 'contributorId'); + const contributorsWithUnconfirmed = contributionsGrouped.map(c => c.value.toString()); + const contributorsWithOnlyConfirmed = this.contributors.reject(c => contributorsWithUnconfirmed.includes(c.id)) - return contributionsGrouped.map(c => { + const kreditsByContributor = contributionsGrouped.map(c => { const amountUnconfirmed = c.items.mapBy('amount').reduce((a, b) => a + b); const contributor = this.contributors.findBy('id', c.value.toString()); + return EmberObject.create({ contributor: contributor, amountUnconfirmed: amountUnconfirmed, amountConfirmed: contributor.totalKreditsEarned, amountTotal: contributor.totalKreditsEarned + amountUnconfirmed }) + }); + + contributorsWithOnlyConfirmed.forEach(c => { + kreditsByContributor.push(EmberObject.create({ + contributor: c, + amountUnconfirmed: 0, + amountConfirmed: c.totalKreditsEarned, + amountTotal: c.totalKreditsEarned + })); }) + + return kreditsByContributor; }), init () { diff --git a/tests/unit/services/kredits-test.js b/tests/unit/services/kredits-test.js index da06057..836870d 100644 --- a/tests/unit/services/kredits-test.js +++ b/tests/unit/services/kredits-test.js @@ -32,8 +32,6 @@ module('Unit | Service | kredits', function(hooks) { const kreditsByContributor = service.kreditsByContributor; - console.log(kreditsByContributor); - assert.equal(kreditsByContributor.length, 3, 'includes all contributors with confirmed kredits'); const c1 = kreditsByContributor.find(k => k.contributor.id == 1); From d2bb70e8a1092fe6f471bce15849481028de32c6 Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Mon, 6 May 2019 18:32:00 +0200 Subject: [PATCH 5/7] Add failing test for vetoed amounts in toplist This specifies the correct behaviour for unconfirmed kredits balances, which is that amounts from vetoed contributions shouldn't be added at all. --- tests/unit/services/kredits-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/services/kredits-test.js b/tests/unit/services/kredits-test.js index 836870d..f18e067 100644 --- a/tests/unit/services/kredits-test.js +++ b/tests/unit/services/kredits-test.js @@ -46,7 +46,7 @@ module('Unit | Service | kredits', function(hooks) { const c3 = kreditsByContributor.find(k => k.contributor.id == 3); assert.equal(c3.amountConfirmed, 0, 'correct amount confirmed'); - assert.equal(c3.amountUnconfirmed, 6500, 'correct amount unconfirmed'); - assert.equal(c3.amountTotal, 6500, 'correct amount total'); + assert.equal(c3.amountUnconfirmed, 5000, 'correct amount unconfirmed'); + assert.equal(c3.amountTotal, 5000, 'correct amount total'); }); }); From 6638691c9f16a7af86c0a7520ae310deed9cba08 Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Mon, 6 May 2019 18:46:59 +0200 Subject: [PATCH 6/7] Remove vetoed amounts from unconfirmed balances --- app/services/kredits.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/kredits.js b/app/services/kredits.js index 7064819..fea5b88 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -46,7 +46,7 @@ export default Service.extend({ }), kreditsByContributor: computed('contributionsUnconfirmed.[]', 'contributors', function() { - const contributionsUnconfirmed = this.contributionsUnconfirmed; + const contributionsUnconfirmed = this.contributionsUnconfirmed.filterBy('vetoed', false); const contributionsGrouped = groupBy(contributionsUnconfirmed, 'contributorId'); const contributorsWithUnconfirmed = contributionsGrouped.map(c => c.value.toString()); const contributorsWithOnlyConfirmed = this.contributors.reject(c => contributorsWithUnconfirmed.includes(c.id)) From 9386c30d09c889348a6f320cbb03ae098646776f Mon Sep 17 00:00:00 2001 From: Garret Alfert Date: Wed, 8 May 2019 12:15:51 +0200 Subject: [PATCH 7/7] Update toplist balance when contribution is vetoed Co-Authored-By: skddc --- app/services/kredits.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/kredits.js b/app/services/kredits.js index fea5b88..8653071 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -45,7 +45,7 @@ export default Service.extend({ }); }), - kreditsByContributor: computed('contributionsUnconfirmed.[]', 'contributors', function() { + kreditsByContributor: computed('contributionsUnconfirmed.@each.vetoed', 'contributors', function() { const contributionsUnconfirmed = this.contributionsUnconfirmed.filterBy('vetoed', false); const contributionsGrouped = groupBy(contributionsUnconfirmed, 'contributorId'); const contributorsWithUnconfirmed = contributionsGrouped.map(c => c.value.toString());