RefundEscrow.test.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. const { EVMRevert } = require('../helpers/EVMRevert');
  2. const expectEvent = require('../helpers/expectEvent');
  3. const { ethGetBalance } = require('../helpers/web3');
  4. const BigNumber = web3.BigNumber;
  5. require('chai')
  6. .use(require('chai-bignumber')(BigNumber))
  7. .should();
  8. const RefundEscrow = artifacts.require('RefundEscrow');
  9. contract('RefundEscrow', function ([owner, beneficiary, refundee1, refundee2]) {
  10. const amount = web3.toWei(54.0, 'ether');
  11. const refundees = [refundee1, refundee2];
  12. beforeEach(async function () {
  13. this.escrow = await RefundEscrow.new(beneficiary, { from: owner });
  14. });
  15. context('active state', function () {
  16. it('accepts deposits', async function () {
  17. await this.escrow.deposit(refundee1, { from: owner, value: amount });
  18. const deposit = await this.escrow.depositsOf(refundee1);
  19. deposit.should.be.bignumber.equal(amount);
  20. });
  21. it('does not refund refundees', async function () {
  22. await this.escrow.deposit(refundee1, { from: owner, value: amount });
  23. await this.escrow.withdraw(refundee1).should.be.rejectedWith(EVMRevert);
  24. });
  25. it('does not allow beneficiary withdrawal', async function () {
  26. await this.escrow.deposit(refundee1, { from: owner, value: amount });
  27. await this.escrow.beneficiaryWithdraw().should.be.rejectedWith(EVMRevert);
  28. });
  29. });
  30. it('only owner can enter closed state', async function () {
  31. await this.escrow.close({ from: beneficiary }).should.be.rejectedWith(EVMRevert);
  32. const receipt = await this.escrow.close({ from: owner });
  33. await expectEvent.inLogs(receipt.logs, 'Closed');
  34. });
  35. context('closed state', function () {
  36. beforeEach(async function () {
  37. await Promise.all(refundees.map(refundee => this.escrow.deposit(refundee, { from: owner, value: amount })));
  38. await this.escrow.close({ from: owner });
  39. });
  40. it('rejects deposits', async function () {
  41. await this.escrow.deposit(refundee1, { from: owner, value: amount }).should.be.rejectedWith(EVMRevert);
  42. });
  43. it('does not refund refundees', async function () {
  44. await this.escrow.withdraw(refundee1).should.be.rejectedWith(EVMRevert);
  45. });
  46. it('allows beneficiary withdrawal', async function () {
  47. const beneficiaryInitialBalance = await ethGetBalance(beneficiary);
  48. await this.escrow.beneficiaryWithdraw();
  49. const beneficiaryFinalBalance = await ethGetBalance(beneficiary);
  50. beneficiaryFinalBalance.sub(beneficiaryInitialBalance).should.be.bignumber.equal(amount * refundees.length);
  51. });
  52. });
  53. it('only owner can enter refund state', async function () {
  54. await this.escrow.enableRefunds({ from: beneficiary }).should.be.rejectedWith(EVMRevert);
  55. const receipt = await this.escrow.enableRefunds({ from: owner });
  56. await expectEvent.inLogs(receipt.logs, 'RefundsEnabled');
  57. });
  58. context('refund state', function () {
  59. beforeEach(async function () {
  60. await Promise.all(refundees.map(refundee => this.escrow.deposit(refundee, { from: owner, value: amount })));
  61. await this.escrow.enableRefunds({ from: owner });
  62. });
  63. it('rejects deposits', async function () {
  64. await this.escrow.deposit(refundee1, { from: owner, value: amount }).should.be.rejectedWith(EVMRevert);
  65. });
  66. it('refunds refundees', async function () {
  67. for (let refundee of [refundee1, refundee2]) {
  68. const refundeeInitialBalance = await ethGetBalance(refundee);
  69. await this.escrow.withdraw(refundee);
  70. const refundeeFinalBalance = await ethGetBalance(refundee);
  71. refundeeFinalBalance.sub(refundeeInitialBalance).should.be.bignumber.equal(amount);
  72. }
  73. });
  74. it('does not allow beneficiary withdrawal', async function () {
  75. await this.escrow.beneficiaryWithdraw().should.be.rejectedWith(EVMRevert);
  76. });
  77. });
  78. });