integration/account.test.ts
import "jest-environment-puppeteer";
import { UnlockedAccounts } from "./constants/accounts";
import BigNumber from "bignumber.js";
require("./helpers/beforeAll");
// TODO: Replace uses of `url` with calls to functions in navigation-helper
const url = `${process.env.AUGUR_URL}`;
const TIMEOUT = 20000; // this is big because loading account balances can take a while
jest.setTimeout(100000);
interface AccountData {
rep?: string;
eth?: string;
}
describe("Account", () => {
let originalAccountData: AccountData;
beforeAll(async () => {
await page.evaluate(
account => window.integrationHelpers.updateAccountAddress(account),
UnlockedAccounts.CONTRACT_OWNER
);
});
describe("Deposit Page", () => {
it("should show correct stats in deposit page", async () => {
await page.goto(url + "#/deposit-funds");
const accountData = await page.evaluate(() =>
window.integrationHelpers.getAccountData()
);
const rep = await accountData.rep;
const eth = await accountData.eth;
const formatRep = await page.evaluate(
value => window.integrationHelpers.formatRep(value),
rep
);
const formatEth = await page.evaluate(
value => window.integrationHelpers.formatEth(value),
eth
);
// correct account ETH and REP should be shown in deposit page
await expect(page).toMatchElement("span.rep_value", {
text: formatRep.formatted,
timeout: TIMEOUT
});
await expect(page).toMatchElement("span.eth_value", {
text: formatEth.formatted,
timeout: TIMEOUT
});
// correct account ETH and REP should be shown in core stats bar
await expect(page).toMatchElement("span#core-bar-rep", {
text: formatRep.formatted,
timeout: TIMEOUT
});
await expect(page).toMatchElement("span#core-bar-eth", {
text: formatEth.formatted,
timeout: TIMEOUT
});
// correct account address should be shown in deposit page
const displayAddress = accountData.displayAddress;
await expect(displayAddress.toLowerCase()).toEqual(
UnlockedAccounts.CONTRACT_OWNER
);
await expect(page).toMatch(displayAddress);
});
});
describe("REP Faucet Page", () => {
it("should have a working 'Get REP' button", async () => {
// keep track of original account data
originalAccountData = await page.evaluate(() =>
window.integrationHelpers.getAccountData()
);
// log in to secondary account - doing rep faucet on this account so that we always have rep to withdraw
await page.evaluate(
account => window.integrationHelpers.updateAccountAddress(account),
UnlockedAccounts.SECONDARY_ACCOUNT
);
// make sure logged in
await page.waitForSelector("#core-bar-eth", { timeout: TIMEOUT });
// navigate to rep faucet
await page.goto(url + "#/rep-faucet");
// get account data
const accountData = await page.evaluate(() =>
window.integrationHelpers.getAccountData()
);
const initialRep = await accountData.rep;
// click 'Get REP' button
await expect(page).toClick(
"button.account-rep-faucet-styles_AccountRepFaucet__button",
{ timeout: TIMEOUT }
);
// verify you receieved a confirmed notification
await expect(page).toClick(
"button.top-bar-styles_TopBar__notification-icon"
);
await expect(page).toMatch("Confirmed", {
timeout: TIMEOUT
});
await expect(page).toMatch("Get REP from faucet", {
timeout: TIMEOUT
});
await expect(page).toClick(
".notification-styles_Notification__closeButton"
);
// balance should now have 47.00 more REP - compare old and new account balances
const newRepPlus = await new BigNumber(initialRep).plus(47);
const formatRep = await page.evaluate(
value => window.integrationHelpers.formatEth(value),
newRepPlus
);
await expect(page).toMatch(formatRep.formatted.split(".")[0], {
timeout: TIMEOUT
}); // decimals may not equal be sometimes cause of rounding
});
});
describe("Withdraw Page", () => {
it("should be able to send funds to another account using the form", async () => {
// send eth from a second account to first account and check that the amount is right
// navigate to withdraw page
await page.goto(url + "#/withdraw-funds");
// withdraw eth
await expect(page).toFill("input#quantity", "100", { timeout: TIMEOUT });
await expect(page).toFill(
"input#address",
UnlockedAccounts.CONTRACT_OWNER
);
await expect(page).toClick("button#withdraw-button");
// check for notification
await expect(page).toClick(
"button.top-bar-styles_TopBar__notification-icon"
);
await expect(page).toMatch("Confirmed", {
timeout: TIMEOUT
});
await expect(page).toMatch("Send ETH", {
timeout: TIMEOUT
});
await expect(page).toMatch(
"Send 100.0000 ETH to 0x913da4198e6be1d5f5e4a40d0667f70c0b5430eb",
{
timeout: TIMEOUT
}
);
await expect(page).toClick(
".notification-styles_Notification__closeButton"
);
await expect(page).toClick(
"button.top-bar-styles_TopBar__notification-icon"
);
// withdraw rep
await expect(page).toClick(".input-dropdown-styles_InputDropdown");
await expect(page).toClick("button", { text: "REP", timeout: TIMEOUT });
await expect(page).toFill("input#quantity", "10", { timeout: TIMEOUT });
await expect(page).toFill(
"input#address",
UnlockedAccounts.CONTRACT_OWNER
);
await expect(page).toClick("button#withdraw-button");
// check for notification
await expect(page).toClick(
"button.top-bar-styles_TopBar__notification-icon"
);
await expect(page).toMatch("Confirmed", {
timeout: TIMEOUT
});
await expect(page).toMatch("Send REP", {
timeout: TIMEOUT
});
await expect(page).toMatch(
"Send 10.0000 REP to 0x913da4198e6be1d5f5e4a40d0667f70c0b5430eb",
{
timeout: TIMEOUT
}
);
await expect(page).toClick(
".notification-styles_Notification__closeButton"
);
await expect(page).toClick(
"button.top-bar-styles_TopBar__notification-icon"
);
// log into original account
await page.evaluate(
account => window.integrationHelpers.updateAccountAddress(account),
UnlockedAccounts.CONTRACT_OWNER
);
await page.goto(url + "#/deposit-funds");
// compare old and new account balances
const eth = await originalAccountData.eth; // sometimes null for newAccountData
const newEth = await new BigNumber(eth || 0).plus(100);
const formatEth = await page.evaluate(
value => window.integrationHelpers.formatEth(value),
newEth
);
await expect(page).toMatch(formatEth.formatted.split(".")[0], {
timeout: TIMEOUT
}); // decimals may not equal be sometimes cause of rounding
const rep = await originalAccountData.rep; // sometimes null for newAccountData
const newRep = await new BigNumber(rep || 0).plus(10);
const formatRep = await page.evaluate(
value => window.integrationHelpers.formatRep(value),
newRep
);
await expect(page).toMatch(formatRep.formatted.split(".")[0], {
timeout: TIMEOUT
}); // decimals may not equal be sometimes cause of rounding
});
});
describe("Authentication", () => {
it("should correctly display 'Account' page", async () => {
// logout
await page.evaluate(() => window.integrationHelpers.logout());
await expect(page).toMatch("Connect An Account", { timeout: TIMEOUT });
// expect to be on authentication page
const pageUrl = await page.url();
await expect(pageUrl).toEqual(`${process.env.AUGUR_URL}#/authentication`);
});
it("should only display three options in the sidebar when not logged in", async () => {
// options available should be "Markets", "Reporting", and "Account"
await page.waitForSelector("a[href$='#/markets']");
await page.waitForSelector("a[href='#/deposit-funds']");
// check that only those three options show up
const sidebarElements = await page.$$("li#side-nav-items");
await expect(sidebarElements.length).toEqual(3);
});
});
});