1 Single Run Compilation


2 Test File Setup

const assert = require("assert");
const ganache = require("ganache-cli");
const Web3 = require("web3");
const web3 = new Web3(ganache.provider());
/* 컴파일과 컴파일펙토리에 대한 각각의 빌드 */
const compiledFactory = require("../ethereum/build/CampaignFactory.json");
const compiledCampaign = require("../ethereum/build/Campaign.json");
let accounts;
let factory;
let campaignAddress;
let campaign;
beforeEach(async () => {
/* 계정 목록 */
accounts = await web3.eth.getAccounts();
/* 팩토리 계약 인스턴스 배포, JSON으로 파싱 */
factory = await new web3.eth.Contract(JSON.parse(compiledFactory.interface))
.deploy({ data: compiledFactory.bytecode })
.send({ from: accounts[0], gas: '1000000' });
/* 데이터를 수정하기 위한 트랜잭션 보내기 - Factory 없이는 결과를 return 받지 못함 */
await factory.methods.createCampaign('100').send({
/* accounts가 0인 계정은 관리자 계정*/
from: accounts[0],
gas: '1000000',
});
/* 실제 인스턴스 생성, 위까진 캠페인이 로컬 블록체인에 존재 */
[campaignAddress] = await factory.methods.getDeployedCampaigns().call();
campaign = await new web3.eth.Contract(
JSON.parse(compiledCampaign.interface),
campaignAddress
);
});
/* json 파일의 test */
describe("Campaigns", () => {
it("deploys a factory and a campaign", () => {
assert.ok(factory.options.address);
assert.ok(campaign.options.address);
});
/* 매핑에 접근, 캠패인에서 manager 메서드를 호출하면 주소 비교 */
it("marks caller as the campaign manager", async() => {
const manager = await campaign.methods.manager().call();
assert.equal(accounts[0], manager);
});
/* 기여자가 기여할 수 있게 하기위한 확인 */
it("allows people to contribute money and marks them as approvers", async() => {
await campaign.methods.contribute().send({
value: "200",
from: accounts[1],
});
const isContributor = await campaign.methods.approvers(accounts[1]).call();
assert(isContributor);
});
/* Minimum에 대한 확인 */
it("requires a minimum contribution", async() => {
try {
await campaign.methods.contribute().send({
value: "5",
from: accounts[1],
});
assert(false);
} catch (err) {
assert(err);
}
});
it("allows a manager to make a payment request", async () => {
await campaign.methods
.createRequest("Buy batteries", '100', accounts[1])
.send({
from: accounts[0],
gas: '1000000',
});
const request = await campaign.methods.requests(0).call();
assert.equal("Buy batteries", request.description);
});
it("processes requests", async () => {
await campaign.methods.contribute().send({
from: accounts[0],
value: web3.utils.toWei('10', "ether"),
});
/* 10ehter를 수령했을 때 request를 생성 */
await campaign.methods
/* 송금에 적절한 금액을 설정 - 5ether */
.createRequest("A", web3.utils.toWei("5", "ether"), accounts[1])
.send({ from: accounts[0], gas: '1000000' });
/* 요청 승인 */
await campaign.methods.approveRequest(0).send({
from: accounts[0],
gas: "1000000",
});
/* 실제 요청 완료 */
await campaign.methods.finalizeRequest(0).send({
from: accounts[0],
gas: "1000000",
});
/* web3에서 모든 계정을 검색 + 현재 잔액 */
let balance = await web3.eth.getBalance(accounts[1]);
balance = web3.utils.fromWei(balance, "ether");
/* balnce 값을 Float로 변환 */
balance = parseFloat(balance);
console.log(balance);
assert(balance > 104);
});
});
1 Single Run Compilation


2 Test File Setup

const assert = require("assert");
const ganache = require("ganache-cli");
const Web3 = require("web3");
const web3 = new Web3(ganache.provider());
/* 컴파일과 컴파일펙토리에 대한 각각의 빌드 */
const compiledFactory = require("../ethereum/build/CampaignFactory.json");
const compiledCampaign = require("../ethereum/build/Campaign.json");
let accounts;
let factory;
let campaignAddress;
let campaign;
beforeEach(async () => {
/* 계정 목록 */
accounts = await web3.eth.getAccounts();
/* 팩토리 계약 인스턴스 배포, JSON으로 파싱 */
factory = await new web3.eth.Contract(JSON.parse(compiledFactory.interface))
.deploy({ data: compiledFactory.bytecode })
.send({ from: accounts[0], gas: '1000000' });
/* 데이터를 수정하기 위한 트랜잭션 보내기 - Factory 없이는 결과를 return 받지 못함 */
await factory.methods.createCampaign('100').send({
/* accounts가 0인 계정은 관리자 계정*/
from: accounts[0],
gas: '1000000',
});
/* 실제 인스턴스 생성, 위까진 캠페인이 로컬 블록체인에 존재 */
[campaignAddress] = await factory.methods.getDeployedCampaigns().call();
campaign = await new web3.eth.Contract(
JSON.parse(compiledCampaign.interface),
campaignAddress
);
});
/* json 파일의 test */
describe("Campaigns", () => {
it("deploys a factory and a campaign", () => {
assert.ok(factory.options.address);
assert.ok(campaign.options.address);
});
/* 매핑에 접근, 캠패인에서 manager 메서드를 호출하면 주소 비교 */
it("marks caller as the campaign manager", async() => {
const manager = await campaign.methods.manager().call();
assert.equal(accounts[0], manager);
});
/* 기여자가 기여할 수 있게 하기위한 확인 */
it("allows people to contribute money and marks them as approvers", async() => {
await campaign.methods.contribute().send({
value: "200",
from: accounts[1],
});
const isContributor = await campaign.methods.approvers(accounts[1]).call();
assert(isContributor);
});
/* Minimum에 대한 확인 */
it("requires a minimum contribution", async() => {
try {
await campaign.methods.contribute().send({
value: "5",
from: accounts[1],
});
assert(false);
} catch (err) {
assert(err);
}
});
it("allows a manager to make a payment request", async () => {
await campaign.methods
.createRequest("Buy batteries", '100', accounts[1])
.send({
from: accounts[0],
gas: '1000000',
});
const request = await campaign.methods.requests(0).call();
assert.equal("Buy batteries", request.description);
});
it("processes requests", async () => {
await campaign.methods.contribute().send({
from: accounts[0],
value: web3.utils.toWei('10', "ether"),
});
/* 10ehter를 수령했을 때 request를 생성 */
await campaign.methods
/* 송금에 적절한 금액을 설정 - 5ether */
.createRequest("A", web3.utils.toWei("5", "ether"), accounts[1])
.send({ from: accounts[0], gas: '1000000' });
/* 요청 승인 */
await campaign.methods.approveRequest(0).send({
from: accounts[0],
gas: "1000000",
});
/* 실제 요청 완료 */
await campaign.methods.finalizeRequest(0).send({
from: accounts[0],
gas: "1000000",
});
/* web3에서 모든 계정을 검색 + 현재 잔액 */
let balance = await web3.eth.getBalance(accounts[1]);
balance = web3.utils.fromWei(balance, "ether");
/* balnce 값을 Float로 변환 */
balance = parseFloat(balance);
console.log(balance);
assert(balance > 104);
});
});