reserved tokens test

This commit is contained in:
dennis00010011b 2018-04-11 16:25:04 -07:00
parent fca9c6f551
commit 5683cffb7a
31 changed files with 2974 additions and 2032 deletions

View File

@ -1,5 +1,5 @@
{
"startURL" : "http://localhost:3000/",
"startURL" : "https://wizard.oracles.org/",
"outputPath":"./results",
"installMetaMask":true

11
entity/Account.js Normal file
View File

@ -0,0 +1,11 @@
'use strict';
class Account {
constructor(address,privateKey){
this.address=address;
this.privateKey=privateKey;
this.balance;
}
}
module.exports.Account=Account;

View File

@ -1,16 +1,118 @@
'use strict';
const Logger= require('../entity/Logger.js');
const logger=Logger.logger;
const tempOutputPath=Logger.tempOutputPath;
const fs = require('fs');
const tier=require('./Tier.js');
const Tier=tier.Tier;
const reservedTokens=require('./ReservedTokens.js');
const ReservedTokens=reservedTokens.ReservedTokens;
class Crowdsale {
constructor(currency,tokenAddress,contractAddress,url,abi){
this.currency=currency;
this.tokenAddress=tokenAddress;
this.contractAddress=contractAddress;
this.url=url;
this.tokenContractAbi=abi;
}
constructor(){
this.name;
this.ticker;
this.walletAddress;
this.reservedTokens=[];
this.whitelist=[];
this.gasPrice;
this.minCap;
this.whitelisting;
this.tiers=[];
this.tokenAddress;
this.contractAddress;
this.url;
this.tokenContractAbi;
}
async parser(fileName) {
var obj=JSON.parse(fs.readFileSync(fileName,"utf8"));
this.name=obj.name;
this.ticker=obj.ticker;
this.decimals=obj.decimals;
for (var i=0;i<obj.reservedTokens.length;i++) {
this.reservedTokens.push (
new ReservedTokens (
obj.reservedTokens[i].address,
obj.reservedTokens[i].dimension,
obj.reservedTokens[i].value
)
)
}
this.walletAddress=obj.walletAddress;
this.gasPrice=obj.gasprice;
this.minCap=obj.mincap;
this.whitelisting=obj.whitelisting;
for (var i=0;i<obj.tiers.length;i++) {
var isWhitelist;
if (this.whitelisting) {
isWhitelist = obj.tiers[i].whitelist;
}
else {
isWhitelist = null;
}
this.tiers.push(
new Tier (
obj.tiers[i].name,
obj.tiers[i].allowModify,
obj.tiers[i].rate,
obj.tiers[i].supply,
obj.tiers[i].startTime,
obj.tiers[i].startDate,
obj.tiers[i].endTime,
obj.tiers[i].endDate,
isWhitelist
)
)
}
}
print(){
logger.info("Crowdsale settings");
logger.info("name :"+this.name);
logger.info("ticker :"+this.ticker);
logger.info("decimals:"+this.decimals);
logger.info("Reserved Tokens:"+this.reservedTokens.length);
for (var i=0;i<this.reservedTokens.length;i++) {
logger.info("Reserved tokens#:"+i);
logger.info("address:"+this.reservedTokens[i].address);
logger.info("dimension:"+this.reservedTokens[i].dimension);
logger.info("value:"+this.reservedTokens[i].value);
}
logger.info("whitelisting:"+this.whitelisting);
logger.info("walletAddress:"+this.walletAddress);
logger.info("gasprice:"+this.gasPrice);
logger.info("mincap:"+this.minCap);
logger.info("number of tiers:"+this.tiers.length);
for (var i=0;i<this.tiers.length;i++) {
logger.info("Tier #"+i);
logger.info("name:"+this.tiers[i].name);
logger.info("allowModify:"+this.tiers[i].allowModify);
logger.info("startDate:"+this.tiers[i].startDate);
logger.info("startTime:"+this.tiers[i].startTime);
logger.info("endDate:"+this.tiers[i].endDate);
logger.info("endTime:"+this.tiers[i].endTime);
logger.info("rate:"+this.tiers[i].rate);
logger.info("supply:"+this.tiers[i].supply);
if(this.tiers[i].whitelist!=null) {
logger.info("Whitelist:" + this.tiers[i].whitelist.length);
for (var j = 0; j < this.tiers[i].whitelist.length; j++) {
logger.info("whitelist#:" + j);
logger.info("Address:" + this.tiers[i].whitelist[j].address);
logger.info("Min:" + this.tiers[j].whitelist[j].min);
logger.info("Max:" + this.tiers[j].whitelist[j].max);
}
}
}
}

View File

@ -1,138 +1,114 @@
'use strict';
const Logger= require('../entity/Logger.js');
const logger=Logger.logger;
const tempOutputPath=Logger.tempOutputPath;
const fs = require('fs');
const tier=require('./Tier.js');
const Tier=tier.Tier;
const reservedTokens=require('./ReservedTokens.js');
const ReservedTokens=reservedTokens.ReservedTokens;
const whitelist=require('./Whitelist.js');
const Whitelist=whitelist.Whitelist;
class Currency{
constructor()
{
this.name;
this.ticker;
this.walletAddress;
this.reservedTokens=[];
this.whitelist=[];
this.gasPrice;
this.minCap;
this.whitelisting=false;
this.tiers=[];
class Currency {
constructor() {
this.name;
this.ticker;
this.walletAddress;
this.reservedTokens=[];
this.whitelist=[];
this.gasPrice;
this.minCap;
this.whitelisting=false;
this.tiers=[];
}
parser(fileName) {
logger.info(fileName);
var obj=JSON.parse(fs.readFileSync(fileName,"utf8"));
this.name=obj.name;
this.ticker=obj.ticker;
this.decimals=obj.decimals;
for (var i=0;i<obj.reservedTokens.length;i++) {
this.reservedTokens.push (
new ReservedTokens (
obj.reservedTokens[i].address,
obj.reservedTokens[i].dimension,
obj.reservedTokens[i].value
)
)
}
static createCurrency(fileName){
var c=new Currency();
c.parser(fileName);
return c;
}
parser(fileName){
logger.info(fileName);
var obj=JSON.parse(fs.readFileSync(fileName,"utf8"));
this.name=obj.name;
this.ticker=obj.ticker;
this.decimals=obj.decimals;
for (var i=0;i<obj.reservedTokens.length;i++)
{
this.reservedTokens.push(
new ReservedTokens(
obj.reservedTokens[i].address,
obj.reservedTokens[i].dimension,
obj.reservedTokens[i].value
)
)
}
this.walletAddress=obj.walletAddress;
this.gasPrice=obj.gasprice;
this.minCap=obj.mincap;
this.whitelisting=obj.whitelisting;
for (var i=0;i<obj.tiers.length;i++)
{
var wh;
if (this.whitelisting) wh=obj.tiers[i].whitelist;
else wh=null;
this.tiers.push(
new Tier(obj.tiers[i].name,
obj.tiers[i].allowModify,
obj.tiers[i].rate,
obj.tiers[i].supply,
obj.tiers[i].startTime,
obj.tiers[i].startDate,
obj.tiers[i].endTime,
obj.tiers[i].endDate,
wh
)
)
this.walletAddress=obj.walletAddress;
this.gasPrice=obj.gasprice;
this.minCap=obj.mincap;
this.whitelisting=obj.whitelisting;
for (var i=0;i<obj.tiers.length;i++) {
var isWhitelist;
if (this.whitelisting) {
isWhitelist = obj.tiers[i].whitelist;
}
else {
isWhitelist = null;
}
this.tiers.push(
new Tier (
obj.tiers[i].name,
obj.tiers[i].allowModify,
obj.tiers[i].rate,
obj.tiers[i].supply,
obj.tiers[i].startTime,
obj.tiers[i].startDate,
obj.tiers[i].endTime,
obj.tiers[i].endDate,
isWhitelist
)
)
}
}
print(){
print(){
logger.info("Crowdsale settings");
logger.info("name :"+this.name);
logger.info("ticker :"+this.ticker);
logger.info("decimals:"+this.decimals);
logger.info("Reserved Tokens:"+this.reservedTokens.length);
for (var i=0;i<this.reservedTokens.length;i++)
{
logger.info("reserved tokens#:"+i);
logger.info("Address:"+this.reservedTokens[i].address);
logger.info("Dimension:"+this.reservedTokens[i].dimension);
logger.info("Value:"+this.reservedTokens[i].value);
for (var i=0;i<this.reservedTokens.length;i++) {
logger.info("Reserved tokens#:"+i);
logger.info("address:"+this.reservedTokens[i].address);
logger.info("dimension:"+this.reservedTokens[i].dimension);
logger.info("value:"+this.reservedTokens[i].value);
}
logger.info("Whitelisting:"+this.whitelisting);
logger.info("WalletAddress:"+this.walletAddress);
logger.info("whitelisting:"+this.whitelisting);
logger.info("walletAddress:"+this.walletAddress);
logger.info("gasprice:"+this.gasPrice);
logger.info("mincap:"+this.minCap);
logger.info("number of tiers:"+this.tiers.length);
for (var i=0;i<this.tiers.length;i++) {
logger.info("Tier #"+i);
logger.info("name:"+this.tiers[i].name);
logger.info("allowModify:"+this.tiers[i].allowModify);
logger.info("startDate:"+this.tiers[i].startDate);
logger.info("startTime:"+this.tiers[i].startTime);
logger.info("endDate:"+this.tiers[i].endDate);
logger.info("endTime:"+this.tiers[i].endTime);
logger.info("rate:"+this.tiers[i].rate);
logger.info("supply:"+this.tiers[i].supply);
logger.info("Number of tiers:"+this.tiers.length);
for (var i=0;i<this.tiers.length;i++)
{
logger.info("Tier #"+i);
logger.info("name:"+this.tiers[i].name);
logger.info("allowModify:"+this.tiers[i].allowModify);
logger.info("startDate:"+this.tiers[i].startDate);
logger.info("startTime:"+this.tiers[i].startTime);
logger.info("endDate:"+this.tiers[i].endDate);
logger.info("endTime:"+this.tiers[i].endTime);
logger.info("rate:"+this.tiers[i].rate);
logger.info("supply:"+this.tiers[i].supply);
if(this.tiers[i].whitelist!=null) {
logger.info("Whitelist:" + this.tiers[i].whitelist.length);
for (var j = 0; j < this.tiers[i].whitelist.length; j++) {
logger.info("whitelist#:" + j);
logger.info("Address:" + this.tiers[i].whitelist[j].address);
logger.info("Min:" + this.tiers[j].whitelist[j].min);
logger.info("Max:" + this.tiers[j].whitelist[j].max);
if(this.tiers[i].whitelist!=null) {
logger.info("Whitelist:" + this.tiers[i].whitelist.length);
for (var j = 0; j < this.tiers[i].whitelist.length; j++) {
logger.info("whitelist#:" + j);
logger.info("Address:" + this.tiers[i].whitelist[j].address);
logger.info("Min:" + this.tiers[j].whitelist[j].min);
logger.info("Max:" + this.tiers[j].whitelist[j].max);
}
}
}
}
}
}
}
}
module.exports={
module.exports= {
Currency:Currency
}

View File

@ -1,35 +1,26 @@
const winston = require('winston');
const fs = require('fs-extra');
const { createLogger, format, transports } = require('winston');
const { combine, timestamp, label, printf } = format;
const myFormat = printf(info => {
return `[${info.timestamp}] ${info.message} `;
//return `${info.timestamp} [${info.label}] ${info.level}: ${info.message}`;
});
const myFormat = printf(info => { return `[${info.timestamp}] ${info.message} `; });
const tempOutputPath='./temp/';
fs.ensureDirSync(tempOutputPath);//create if doesn't exist
fs.ensureDirSync(tempOutputPath);
tempOutputFile=tempOutputPath+'result.log';
fs.ensureFileSync(tempOutputFile);
const logger = createLogger({
format: combine(
label({ label: '' }),
timestamp(),
myFormat
format: combine(
label({ label: '' }),
timestamp(),
myFormat
),
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({filename: tempOutputFile})
]
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({filename: tempOutputFile})
]
});
exports.logger=logger;
exports.tempOutputPath=tempOutputPath;
exports.tempOutputFile=tempOutputFile;

View File

@ -1,47 +0,0 @@
/*const fs = require('fs');
const Logger= require('../entity/Logger.js');
const logger=Logger.logger;
const tempOutputPath=Logger.tempOutputPath;
class MetaMaskWallet {
constructor() {
this.privateKey;
this.account;
this.networkID;
}
static createMetaMaskWallet(fileName){
var c=new MetaMaskWallet();
//by default
//c.account="0xF16AB2EA0a7F7B28C267cbA3Ed211Ea5c6e27411";
// c.privateKey="03c06a9fab22fe0add145e337c5a8251e140f74468d72eab17ec7419ab812cd0";
// c.networkID=4;//1-main network by default
c.parser(fileName);
return c;
}
parser(fileName){
var obj=JSON.parse(fs.readFileSync(fileName,"utf8"));
this.account=obj.account;
this.privateKey=obj.privateKey;
this.networkID=obj.networkID;
}
print(){
console.log("account:"+this.account);
console.log("privateKey:"+this.privateKey);
console.log("networkID:"+this.networkID);
}
}
module.exports={
MetaMaskWallet:MetaMaskWallet
}
*/

View File

@ -1,20 +1,8 @@
const Logger= require('../entity/Logger.js');
const logger=Logger.logger;
const tempOutputPath=Logger.tempOutputPath;
class ReservedTokens {
constructor(address, dimension, value) {
this.address = address;
this.dimension = dimension;
this.value = value;
}
constructor(address, dimension, value) {
this.address = address;
this.dimension = dimension;
this.value = value;
}
}
module.exports.ReservedTokens=ReservedTokens;

View File

@ -1,44 +0,0 @@
var GoogleSpreadsheet = require('google-spreadsheet');
var async = require('async');
var creds = require('../client_secret.json');
const fs = require('fs');
// Create a document object using the ID of the spreadsheet - obtained from its URL.
var doc = new GoogleSpreadsheet('1oWsbaZspCJgAWxCfTEIUnhVWw0unS_apP6mYaBYWPXs');
var fileName="./abracadabra.txt";
class SpreadSheet {
static async readSheet() {
doc.useServiceAccountAuth(creds, function (err) {
// Get all of the rows from the spreadsheet.
doc.getCells(1, {
'min-row': 1,
'max-row': 1,
'min-col': 1,
'max-col': 1,
'return-empty': true
}, function (err, cells) {
var cell = cells[0];
//console.log(cell.value);
fs.writeFileSync(fileName, cell.value);
if (cell.value != '1') {
cell.value = "1";
cell.save();
}
});
});
//console.log("return");
var s = await fs.readFileSync(fileName, "utf8");
return s;
}
}
module.exports.SpreadSheet=SpreadSheet;

View File

@ -1,21 +1,14 @@
const Logger= require('../entity/Logger.js');
const logger=Logger.logger;
const tempOutputPath=Logger.tempOutputPath;
class Tier{
constructor(name,allowModify,rate,supply,startTime,startDate,endTime,endDate,whitelist){
this.name=name;
this.allowModify=allowModify;
this.rate=rate;
this.supply=supply;
this.startTime=startTime;
this.startDate=startDate;
this.endTime=endTime;
this.endDate=endDate;
this.whitelist=whitelist;
}
class Tier {
constructor(name,allowModify,rate,supply,startTime,startDate,endTime,endDate,whitelist){
this.name=name;
this.allowModify=allowModify;
this.rate=rate;
this.supply=supply;
this.startTime=startTime;
this.startDate=startDate;
this.endTime=endTime;
this.endDate=endDate;
this.whitelist=whitelist;
}
}
module.exports.Tier=Tier;

File diff suppressed because it is too large Load Diff

View File

@ -19,8 +19,6 @@ const webdriver = require('selenium-webdriver'),
const By=by.By;
const currency= require('./entity/Currency.js');
const Currency=currency.Currency;
const metaMaskWallet=require('./entity/MetaMaskWallet.js');
const MetaMaskWallet=metaMaskWallet.MetaMaskWallet;
const tierpage=require('./pages/TierPage.js');
const TierPage=tierpage.TierPage;
const Web3 = require('web3');
@ -109,7 +107,7 @@ async function run() {
driver= await Utils.startBrowserWithMetamask();
var mtMask = new MetaMask(driver);
await mtMask.open();//return activated Metamask and empty page
await mtMask.activate();//return activated Metamask and empty page
var test1 = new Test1(driver,Utils.getOutputPath());
// var d=await Utils.getDateFormat(driver);

954
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -5,17 +5,24 @@
"scripts": {
"startGanache": "npm install -g ganache-cli && ganache-cli &",
"e2e-deployRegistry": "node ./contracts/DeployRegistry.js",
"test1": "mocha ./test/testSuite1.js",
"test1": "mocha -b ./test/testSuite1.js",
"test2": "mocha ./test/testSuite2.js",
"ind": "node ./index.js"
"ind": "node ./index.js",
"ra": "node ./test/testRA.js",
"test3":"mocha ./test/test3.js"
},
"dependencies": {
"chromedriver": "^2.35.0",
"ethereumjs-wallet": "^0.6.0",
"fs-extra": "^5.0.0",
"mocha": "^5.0.1",
"nodemailer": "^4.6.0",
"selenium-webdriver": "^3.6.0",
"web3": "1.0.0-beta.31",
"winston": "^3.0.0-rc1"
},
"devDependencies": {
"babel-core": "^6.26.0",
"babel-preset-es2015": "^6.24.1"
}
}

View File

@ -16,9 +16,11 @@ class CrowdsalePage extends page.Page{
super(driver);
this.URL;
this.name="Crowdsale page :";
}
async isPresentButtonInvest() {
logger.info(this.name+" button Invest :");
return super.isElementPresent(buttonInvest);
}
async clickButtonInvest(){
logger.info(this.name+"button Invest :");
await super.clickWithWait(buttonInvest);
@ -28,4 +30,4 @@ class CrowdsalePage extends page.Page{
}
module.exports={
CrowdsalePage:CrowdsalePage
}
}

View File

@ -16,6 +16,8 @@ const fieldBalance=By.className("balance-title");
const fields=By.className("hashes-title");
const warningText=By.id("swal2-content");
const errorNotice=By.className("css-6bx4c3");
const countdownTimer=By.className("timer");
const countdownTimerValue=By.className("timer-count");
class InvestPage extends Page{
@ -25,7 +27,22 @@ class InvestPage extends Page{
this.fieldTokenAddress;
this.fieldContractAddress;
this.fieldCurrentAccount;
this.name="Invest page :"
this.name="Invest page :";
this.timer=[];
}
async initTimer(){
logger.info(this.name+ ":init countdown timer : ");
try {
let arr = await super.findWithWait(countdownTimer);
this.timer = arr[0];
return arr;
}
catch(err){
logger.info(this.name+": dont contain countdown timer ");
return null;
}
}
async initFields(){
var arr = await super.findWithWait(fields);
@ -33,6 +50,28 @@ class InvestPage extends Page{
this.fieldContractAddress = arr[2];
this.fieldCurrentAccount=arr[0];
}
async isCrowdsaleTimeOver(){
try {
logger.info(this.name + " :isCrowdsaleTimeOver:");
let arr = await super.findWithWait(countdownTimerValue);
let result = 0;
for (let i = 0; i < arr.length; i++) {
result = result + parseInt((await this.getTextByElement(arr[i])));
}
if (result<0) result=0;
return (result===0);
}
catch (err){
logger.info("Can not find timer");
return false;
}
}
async getBalance(){
logger.info(this.name+"get Balance :");
@ -47,6 +86,10 @@ class InvestPage extends Page{
logger.info(this.name+"Warning :");
return (await super.isElementPresent(buttonOk));
}
async isPresentCountdownTimer(){
logger.info(this.name+"countdown timer :");
return (await super.isElementPresent(countdownTimer));
}
async clickButtonOK(){
logger.info(this.name+"button OK :");
@ -63,9 +106,9 @@ class InvestPage extends Page{
logger.info(this.name+"button Contribute :");
await super.clickWithWait(buttonContribute);
}
async getWarningText(){
logger.info(this.name+"Warning text :");
return await super.getTextByLocator(warningText);
async getWarningText(){
logger.info(this.name+"Warning text :");
return await super.getTextByLocator(warningText);
}
async getErrorText(){

View File

@ -90,10 +90,10 @@ class MetaMask extends page.Page{
await super.clickWithWait(buttonUnlock);
}
async open()
async activate()
{
await this.switchToNextPage();
logger.info(this.name+"open: "+this.URL);
logger.info(this.name+"activate: "+this.URL);
await this.driver.get(this.URL);
await this.driver.sleep(2000);
@ -112,11 +112,11 @@ class MetaMask extends page.Page{
logger.info("Button 2nd Accept");
await super.clickWithWait(buttonAccept);
logger.info("Fill password");
//await this.driver.sleep(10000);
let cc=50;
do{
do {
await this.driver.sleep(1000);
if (super.isElementPresentWithWait(fieldNewPass)) break;
if (super.isElementPresentWithWait(fieldNewPass))
break;
} while(cc-->0);
if (cc<=0) throw Error("Metamask haven't downloaded");
await super.clickWithWait(fieldNewPass);
@ -164,7 +164,7 @@ class MetaMask extends page.Page{
await super.fillWithWait(fieldPrivateKey,user.privateKey);
await this.driver.sleep(1000);
await super.clickWithWait(buttonImport);
user.accN=accN-1;
user.accountOrderInMetamask=accN-1;
await super.switchToNextPage();
@ -176,7 +176,7 @@ class MetaMask extends page.Page{
// this.clickImportAccount();
await this.chooseProvider(user.networkID);
await super.clickWithWait(popupAccount);
await this.driver.executeScript( "document.getElementsByClassName('dropdown-menu-item')["+(user.accN)+"].click();");
await this.driver.executeScript( "document.getElementsByClassName('dropdown-menu-item')["+(user.accountOrderInMetamask)+"].click();");
await this.driver.sleep(1000);//!!!!!!!!!!!!!!!
await this.switchToNextPage();
@ -246,7 +246,6 @@ async isPresentButtonSubmit()
switch(provider)
{
case 77:{
url="https://sokol.poa.network";
networks.push(77);

View File

@ -1,396 +1,345 @@
const Logger= require('../entity/Logger.js');
const logger=Logger.logger;
const tempOutputPath=Logger.tempOutputPath;
const utils=require('../utils/Utils.js');
const Utils=utils.Utils;
const key = require('selenium-webdriver').Key;
const webdriver = require('selenium-webdriver'),
chrome = require('selenium-webdriver/chrome'),
firefox = require('selenium-webdriver/firefox'),
by = require('selenium-webdriver/lib/by');
const By=by.By;
const loader=By.className("loading-container");
const titles=By.className("title");
const key = require('selenium-webdriver').Key;
const Twait=14000;
Twaittransaction=5000;
class Page {
constructor(driver) {
this.driver=driver;
this.pageTitle;
}
constructor(driver){
this.driver=driver;
this.pageID;
this.footer;
this.header;
this.pageTitle;
}
async initTitles(){
try{
logger.info("init titles");
var locator = By.className("title");
var arr = await this.findWithWait(locator);
this.pageTitle=arr[0];
return arr;
}
catch(err){
logger.info("Page has no title");
return null;
}
async initTitles() {
try {
logger.info("init titles:");
let array = await this.findWithWait(titles);
this.pageTitle = array[0];
return array;
}
async getTitleText(){
let arr=await this.initTitles();
if (arr!=null){
let s=await this.getTextByElement(this.pageTitle);
return s;}
else return "";
}
async isElementDisabled(element)
{
logger.info("isElementDisabled ")
try{
let field;
if (element.constructor.name!="WebElement")
{
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
}
else field = element;
var b= await this.driver.wait(webdriver.until.elementIsDisabled(field), 100);
logger.info("Element disabled ")
return true;
}
catch(err){
logger.info("Element enabled or does not present")
logger.info("Error: "+err);
return false;
}
catch(err) {
logger.info("Page has no title");
return null;
}
}
async findElementInArray(locator,className)
{
try {
await this.driver.wait(webdriver.until.elementsLocated(locator), 10000, 'Element NOT present.Time out.\n');
var arr = await this.driver.findElements(locator);
for (var i = 0; i < arr.length; i++) {
var s = await arr[i].getAttribute("className");
if (s.includes(className)) return arr[i];
}
}
catch(err){
logger.info("Can't find "+ locator+ "in array of "+ className+".\n"+err);
return null;
}
}
async isElementPresentWithWait(element){
try {
await this.driver.wait(webdriver.until.elementLocated(element), Twaittransaction,'Element NOT present.Time out.\n');
logger.info(" element present");
return true;
}
catch(err)
{
logger.info(" element NOT present "+ err);
return false;
}
}
async isElementPresent(element) {
var q;
try {
q = await this.driver.findElement(element).isDisplayed();
logger.info(" element present");
} catch (err) {
q = false;
logger.info(" element NOT present");
}
logger.info(q)
return q;
}
async getTextByElement(element)
{
logger.info("get text ");
var s=await element.getText();
if(s.length<100) logger.info("Text received: "+s);
return s;
}
async getAttribute(element,attr){
logger.info("get attribute = "+attr+ "for element = "+element);
let field;
if (element.constructor.name!="WebElement")
{
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
}
else field = element;
let s=await field.getAttribute(attr);
logger.info("Got value= "+s);
return s;
async getTitleText() {
logger.info("get title text : ")
let array=await this.initTitles();
if (array!=null) {
let text=await this.getTextByElement(this.pageTitle);
logger.info("received "+text);
return text;
}
async getTextByLocatorFast(locator)
{
logger.info("get text ");
let s="";
try {
await
this.driver.wait(webdriver.until.elementLocated(locator), 500, 'Element ' + locator + 'NOT present.Time out.\n');
s=await this.driver.findElement(locator).getText();
logger.info("got text: "+s);
return s;
else return "";
}
}
catch(err){
async isElementDisabled(element) {
logger.info("isElementDisabled :")
try {
let field;
if (element.constructor.name!="WebElement") {
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
}
else field = element;
return s="";
}
await this.driver.wait(webdriver.until.elementIsDisabled(field), 100);
logger.info("element disabled ")
return true;
}
catch(err) {
logger.info("Element enabled or does not present")
return false;
}
}
async getTextByLocator(locator)
{
//await this.driver.sleep(7000);
logger.info("get text ");
await this.driver.wait(webdriver.until.elementLocated(locator), Twait,'Element '+locator+'NOT present.Time out.\n');
return await this.driver.findElement(locator).getText();
}
async getURL()
{
async findElementInArray(locator,className) {
try {
await this.driver.wait(webdriver.until.elementsLocated(locator), 10000, 'Element NOT present.Time out.\n');
let arr = await this.driver.findElements(locator);
for (let i = 0; i < arr.length; i++) {
let s = await arr[i].getAttribute("className");
if (s.includes(className)) return arr[i];
}
}
catch(err) {
logger.info("Can't find "+ locator+ "in array of "+ className+".\n"+err);
return null;
}
}
async isElementPresentWithWait(element) {
logger.info("is element present with waiting :");
try {
await this.driver.wait(webdriver.until.elementLocated(element), Twaittransaction,'Element NOT present.Time out.\n');
logger.info(" element present");
return true;
}
catch(err) {
logger.info(" element NOT present, "+ err);
return false;
}
}
async isElementPresent(element) {
logger.info("is element present :");
try {
await this.driver.findElement(element).isDisplayed();
logger.info(" element present");
return true;
}
catch (err) {
logger.info(" element NOT present");
return false;
}
}
async getTextByElement(element) {
logger.info("get text for element : ");
let s=await element.getText();
if(s.length<100) logger.info("text received: "+s);
return s;
}
async getAttribute(element,attr) {
logger.info("get attribute = "+attr+ "for element = "+element);
let field;
if (element.constructor.name!="WebElement") {
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
}
else field = element;
let s=await field.getAttribute(attr);
logger.info("received value= "+s);
return s;
}
async getTextByLocatorFast(locator) {
logger.info("get text for locator fast:");
try {
await this.driver.wait(webdriver.until.elementLocated(locator), 500, 'Element ' + locator + 'NOT present.Time out.\n');
let s=await this.driver.findElement(locator).getText();
logger.info("received text: "+s);
return s;
}
catch(err) {
return "";
}
}
async getTextByLocator(locator) {
logger.info("get text for locator ");
try {
await this.driver.wait(webdriver.until.elementLocated(locator), Twait, 'Element ' + locator + 'NOT present.Time out.\n');
let s=await this.driver.findElement(locator).getText();
logger.info("received text: "+s);
return s;
}
catch(err) {
return "";
}
}
async getURL() {
logger.info("get current page URL ");
return await this.driver.getCurrentUrl();
}
async open (url){
}
logger.info("open "+url);
await this.driver.get(url);
logger.info("Current URL: "+await this.driver.getCurrentUrl());
logger.info("Current HANDLE: "+await this.driver.getWindowHandle());
await this.driver.sleep(5000);
}
async clearField(element,n){
logger.info("Class name="+element.constructor.name);
let c=10;
let s="empty";
do {
logger.info("clear");
let field;
// if (n != 1)
if (element.constructor.name!="WebElement")
{
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
}
else field = element;
await field.clear();
await this.driver.sleep(1000);
await field.clear();
// await field.clear();
s=await this.getTextByElement(field);
if (s=="") {logger.info("Break with c="+c+", s="+s); break;}
logger.info("Field contains:"+s);
s=s.trim();
c--;
} while((c>0))
}
async open (url) {
logger.info("open "+url);
await this.driver.get(url);
logger.info("Current URL: "+await this.driver.getCurrentUrl());
logger.info("Current HANDLE: "+await this.driver.getWindowHandle());
await this.driver.sleep(5000);
}
async fillField(field,address){
static async triggerOnChangeEvent(){
this.driver.executeScript(
"if ('createEvent' in document) {" +
" var evt = document.createEvent('HTMLEvents');" +
" evt.initEvent('change', false, true);" +
" element.dispatchEvent(evt);} " +
" else" +
" element.fireEvent('onchange');"
logger.info("fill: value = "+address);
await field.sendKeys(address);
}
);
async clickWithWait(element) {
}
logger.info("click" +element);
try{
let field;
if (element.constructor.name!="WebElement")
{
async clearField(element) {
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
}
else field = element;
logger.info("clear field :");
let field;
if (element.constructor.name!="WebElement") {
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
}
else field = element;
let s="";
let counter=3;
do {
await field.click();
await this.driver.sleep(500);
for (let i=0;i<40;i++) {
await field.sendKeys(key.BACK_SPACE);
}
await this.driver.sleep(500);
s=await field.getAttribute('value');
//if (s=="") break;
} while ((s!="")&&(counter-->0));
}
async clickWithWait(element) {
logger.info("click with wait" +element);
try {
let field;
if (element.constructor.name!="WebElement") {
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
}
else field = element;
await field.click();
// await field.sendKeys(key.TAB);
return true;
}
catch(err){logger.info("Can not click element"+ element);
return false;
}
}
async waitUntilLocated(element)
{
try {
await this.driver.wait(webdriver.until.elementLocated(element), Twait);
catch(err) {
logger.info("Can not click element"+ element);
return false;
}
catch(err){logger.info("Element "+ element+" has not appeared in"+ Twait+" sec.");
}
}
}
async waitUntilLocated(element) {
logger.info("wait until located");
try {
await this.driver.wait(webdriver.until.elementLocated(element), Twait);
}
catch(err) {
logger.info("Element "+ element+" has not appeared in"+ Twait+" sec.");
}
async fillWithWait(element,k) {
}
try {
logger.info("fill:field: "+element +" with value = " + k);
async fillWithWait(element,k) {
logger.info("fill with wait :");
try {
logger.info("fill:field: "+element +" with value = " + k);
let field;
if (element.constructor.name!="WebElement") {
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
}
else field = element;
await field.sendKeys(k);
return true;
}
catch(err) {
logger.info("Element "+ element+" has not appeared in"+ Twait+" sec.");
return false;
}
}
let field;
// if (n != 1)
if (element.constructor.name!="WebElement")
{
async refresh() {
logger.info("refresh :");
await this.driver.navigate().refresh();
}
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
}
else field = element;
await field.sendKeys(k);
async findWithWait(element) {
logger.info("find with wait ");
try {
await this.driver.wait(webdriver.until.elementLocated(element), Twait);
return await this.driver.findElements(element);
}
catch(err) {
logger.info("Element "+ element+" have not appeared in"+ Twait+" sec.");
return null;
}
}
async isDisplayedLoader() {
logger.info("is loader displayed :");
try {
let s = await this.driver.findElement(loader).getAttribute("className");
if (s == "loading-container notdisplayed") {
logger.info("NOT displayed"+", s="+s);
return false;
}
else {
logger.info("displayed"+", s="+s);
return true;
}
}
catch (err) {
logger.info("can't find loader. "+err);
return false;
}
}
}
catch(err){
logger.info("Element "+ element+" has not appeared in"+ Twait+" sec.");
return false; }
}
async refresh(){
logger.info("refresh");
await this.driver.navigate().refresh();
await Utils.takeScreenshoot(this.driver);
}
async findWithWait(element)
{
logger.info("find");
try {
await this.driver.wait(webdriver.until.elementLocated(element), Twait);
return await this.driver.findElements(element);
}
catch(err){logger.info("Element "+ element+" have not appeared in"+ Twait+" sec.");
return null;}
}
async clickTo(element){
logger.info("click");
await element.click();
}
async isDisplayedLoader(){
try {
var s = await this.driver.findElement(loader).getAttribute("className");
if (s == "loading-container notdisplayed") {
logger.info("NOT displayed"+", s="+s);
return false;
}
else {
logger.info("displayed"+", s="+s);
return true;
}
}
catch (err){
logger.info("can't find loader. "+err);
return false;
}
}
async waitUntilLoaderGone(){
logger.info("Loader :");
try {
let c = 0;
let limit=40;
do {
async waitUntilLoaderGone() {
logger.info("wait until loader gone :");
try {
let counter = 0;
let limit=40;
do {
this.driver.sleep(1000);
await this.isDisplayedLoader();
if (c++ > limit) throw ("Loading container displayed more than "+limit+" sec");
}
while ((await this.isDisplayedLoader()));
}
catch(err){
console.log(err);
await this.refresh();
await this.driver.sleep(5000);
}
if (counter++ > limit) throw ("Loading container displayed more than "+limit+" sec");
} while ((await this.isDisplayedLoader()));
}
catch(err) {
logger.info(err);
await this.refresh();
await this.driver.sleep(5000);
}
async goBack(){
this.driver.navigate().back();
}
}
async switchToNextPage(){
async goBack() {
logger.info("go back :")
this.driver.navigate().back();
}
logger.info("switch to next tab");
let dr=this.driver;
let allHandles=[];
async switchToNextPage(){
logger.info("switch to next tab :");
let allHandles=[];
let curHandle;
try {
allHandles = await dr.getAllWindowHandles();
//if (allHandles.length>2) throw ("Browser has more than 2 windows")
curHandle = await dr.getWindowHandle();
if (allHandles.length>2){
logger.info("Browser has more than 2 windows"+". \n"+ "Amount of window is "+ allHandles.length);
var arr=[];
arr[0]=allHandles[0];
arr[1]=allHandles[1];
allHandles=arr;
logger.info("New allHandles.length="+allHandles.length);
}
let handle;
for (let i = 0; i < allHandles.length; i++) {
if (curHandle != allHandles[i]) {handle = allHandles[i];break;}
}
logger.info("Current handle = "+ curHandle);
logger.info("Switch to handle = "+ handle);
await dr.switchTo().window(handle);
}
catch (err){
logger.info("Can't switch to next tab "+err+". \n"+ "Amount of window is "+ allHandles.length);
logger.info("Current handle: "+curHandle);
}
}
try {
allHandles = await this.driver.getAllWindowHandles();
curHandle = await this.driver.getWindowHandle();
if (allHandles.length>2) {
logger.info("Browser has more than 2 windows"+". \n"+ "Amount of window is "+ allHandles.length);
let arr=[];
arr[0]=allHandles[0];
arr[1]=allHandles[1];
allHandles=arr;
logger.info("New allHandles.length="+allHandles.length);
}
let handle;
for (let i = 0; i < allHandles.length; i++) {
if (curHandle != allHandles[i]) {
handle = allHandles[i];
break;
}
}
logger.info("Current handle = "+ curHandle);
logger.info("Switch to handle = "+ handle);
await this.driver.switchTo().window(handle);
}
catch (err){
logger.info("can't switch to next tab "+err+". \n"+ "amount of window is "+ allHandles.length);
logger.info("current handle: "+curHandle);
}
}
}
module.exports.Page=Page;

View File

@ -58,15 +58,22 @@ class ReservedTokensPage extends Page{
}
async init(){
var locator = By.className("input");
var arr = await super.findWithWait(locator);
this.fieldAddress = arr[3];
this.fieldValue = arr[4];
locator=By.className("radio-inline");
var arr = await super.findWithWait(locator);
this.checkboxTokens=arr[0];
this.checkboxPercentage=arr[1];
try {
logger.info(this.name + ": init input fields and checkboxes: ");
let locator = By.className("input");
let arr = await super.findWithWait(locator);
this.fieldAddress = arr[3];
this.fieldValue = arr[4];
locator = By.className("radio-inline");
arr = await super.findWithWait(locator);
this.checkboxTokens = arr[0];
this.checkboxPercentage = arr[1];
return arr;
}
catch(err){
logger.info(this.name+": dont contain input elements or/and checkboxes");
return null;
}
}
async amountAddedReservedTokens(){
@ -85,7 +92,7 @@ class ReservedTokensPage extends Page{
async fillReservedTokens(reservedTokens){
logger.info(this.name+": ");
logger.info(this.name+"fill : ");
do {
await this.fillAddress(reservedTokens.address);
@ -117,9 +124,10 @@ class ReservedTokensPage extends Page{
if (address=="") return;
else {
logger.info("Wallet address"+address);
await this.init();
await super.clearField(this.fieldAddress);
await super.fillField(this.fieldAddress, address);
let arr=await this.init();
logger.info("LLL"+arr.length);
//await super.clearField(this.fieldAddress);
await super.fillWithWait(this.fieldAddress, address);
}
}
@ -128,24 +136,23 @@ class ReservedTokensPage extends Page{
if (value==undefined) return;
await this.init();
await super.clearField(this.fieldValue);
await super.fillField(this.fieldValue,value);
//await super.clearField(this.fieldValue);
await super.fillWithWait(this.fieldValue,value);
}
async clickCheckboxPercentage(){
logger.info(this.name+"checkbox Percentage :");
await this.init();
await super.clickTo(this.checkboxPercentage);
await super.clickWithWait(this.checkboxPercentage);
}
async clickCheckboxTokens() {
logger.info(this.name+"checkbox Tokens :");
await this.init();
await super.clickTo(this.checkboxTokens);
await super.clickWithWait(this.checkboxTokens);
}
async clickButtonAddReservedTokens(){
async clickButtonAddReservedTokens() {
logger.info(this.name+"button AddReservedTokens :");
await super.clickWithWait(buttonAdd);
}
@ -179,6 +186,7 @@ class ReservedTokensPage extends Page{
}
async isPresentWarningAddress(){
return false;
await this.initWarnings();
let s=await super.getTextByElement(this.warningAddress);
if (s!="") return true;
@ -186,6 +194,7 @@ class ReservedTokensPage extends Page{
}
async isPresentWarningValue(){
return false;
await this.initWarnings();
let s=await super.getTextByElement(this.warningValue);
if (s!="") return true;

View File

@ -20,6 +20,9 @@ const WhitelistContainer=By.className("white-list-item-container-inner");
const buttonClearAll=By.className("fa fa-trash");
const buttonYesAlert=By.className("swal2-confirm swal2-styled");
class TierPage extends page.Page {
constructor(driver,tier){
@ -183,6 +186,7 @@ class TierPage extends page.Page {
logger.info(this.name+"field Rate: ");
let locator=this.fieldRateTier;
await super.clearField(locator);
await super.fillWithWait(locator,this.tier.rate);
}
@ -190,7 +194,7 @@ class TierPage extends page.Page {
{ await this.init();
logger.info(this.name+"field Supply: ");
let locator=this.fieldSupplyTier;
await super.clearField(locator);
// await super.clearField(locator);
await super.fillWithWait(locator,this.tier.supply);
}
@ -216,8 +220,8 @@ class TierPage extends page.Page {
if((this.tier.startDate==""))
{
this.tier.startDate=Utils.getDateNear(80000,format);
this.tier.startTime=Utils.getTimeNear(80000,format);
this.tier.startDate=Utils.getDateWithAdjust(80000,format);
this.tier.startTime=Utils.getTimeWithAdjust(80000,format);
} else
if (format=="mdy") {
@ -243,8 +247,8 @@ class TierPage extends page.Page {
if (! this.tier.endDate.includes("/"))
{
this.tier.endTime=Utils.getTimeNear(parseInt(this.tier.endDate),"utc");
this.tier.endDate=Utils.getDateNear(parseInt(this.tier.endDate),"utc");
this.tier.endTime=Utils.getTimeWithAdjust(parseInt(this.tier.endDate),"utc");
this.tier.endDate=Utils.getDateWithAdjust(parseInt(this.tier.endDate),"utc");
}

View File

@ -11,7 +11,6 @@ const By=by.By;
const buttonContinue= By.className("button button_fill");
class WizardStep1 extends page.Page{
constructor(driver){
@ -36,7 +35,7 @@ class WizardStep1 extends page.Page{
}
async open(){
logger.info(this.name+"open");
await this.driver.get(this.URL);
await this.driver.get(this.URL);
}

View File

@ -10,16 +10,15 @@ const webdriver = require('selenium-webdriver'),
by = require('selenium-webdriver/lib/by');
const By=by.By;
const buttonContinue=By.xpath("//*[contains(text(),'Continue')]");
const fieldName=By.id("name");
const fieldTicker=By.id("ticker");;
const fieldDecimals=By.id("decimals");;
class WizardStep2 extends page.Page {
constructor(driver) {
super(driver);
this.URL;
this.fieldName;
this.fieldTicker;
this.fieldDecimals;
this.name="WizardStep2 page: ";
this.warningName;
this.warningTicker;
@ -29,21 +28,7 @@ class WizardStep2 extends page.Page {
this.title="TOKEN SETUP";
}
async init(){
try {
var locator = By.className("input");
var arr = await super.findWithWait(locator);
this.fieldName = arr[0];
this.fieldTicker = arr[1];
this.fieldDecimals = arr[2];
return arr;
}
catch(err){
logger.info(this.name+": dont contain input elements");
return null;
}
}
async initWarnings(){
try {
@ -74,20 +59,20 @@ async isPresentFieldName(){
async fillName(name){
try{
logger.info(this.name+"field Name: ");
await this.init();
await super.clearField(this.fieldName);
await super.fillField(this.fieldName,name);
return true;}
catch (err)
{logger.info(err);
return false;}
await super.clearField(fieldName);
await super.fillWithWait(fieldName,name);
// return true;
}
catch (err) {
logger.info(err);
return false;
}
}
async fillTicker(name){
try {
logger.info(this.name + "field Ticker: ");
await this.init();
await super.clearField(this.fieldTicker);
await super.fillField(this.fieldTicker, name);
await super.clearField(fieldTicker);
await super.fillWithWait(fieldTicker, name);
return true;
}
catch (err)
@ -97,9 +82,8 @@ catch (err)
async fillDecimals(name) {
try{
logger.info(this.name + "field Decimals: ");
await this.init();
await super.clearField(this.fieldDecimals);
await super.fillField(this.fieldDecimals, name);
//await super.clearField(fieldDecimals);
await super.fillWithWait(fieldDecimals, name);
return true;
}
catch (err)
@ -122,6 +106,7 @@ async clickButtonContinue(){
}
async isPresentWarningName(){
return false;
await this.initWarnings();
let s=await super.getTextByElement(this.warningName);
if (s!="") return true;
@ -129,6 +114,7 @@ async clickButtonContinue(){
}
async isPresentWarningTicker(){
return false;
await this.initWarnings();
let s=await super.getTextByElement(this.warningTicker);
if (s!="") return true;
@ -136,6 +122,7 @@ async clickButtonContinue(){
}
async isPresentWarningDecimals(){
return false;
await this.initWarnings();
let s=await super.getTextByElement(this.warningDecimals);
if (s!="") return true;
@ -146,8 +133,8 @@ async clickButtonContinue(){
async getFieldDecimals(){
logger.info(this.name+"getFieldDecimals: ");
try {
await this.init();
let s = super.getAttribute(this.fieldDecimals, "value");
let s = super.getAttribute(fieldDecimals, "value");
return s;
}
catch (err)
@ -159,8 +146,8 @@ async clickButtonContinue(){
async isDisabledDecimals(){
await this.init();
return await super.isElementDisabled(this.fieldDecimals);
return await super.isElementDisabled(fieldDecimals);
}
}

View File

@ -12,6 +12,11 @@ const By=by.By;
const buttonContinue=By.xpath("//*[contains(text(),'Continue')]");
const buttonAddTier=By.className("button button_fill_secondary");
const buttonOK=By.className("swal2-confirm swal2-styled");
const fieldWalletAddress=By.id("walletAddress");
const fieldMinCap=By.id("minCap");
let flagCustom=false;
let flagWHitelising=false;
@ -120,10 +125,15 @@ catch(err)
}
async fillWalletAddress(address){
await this.init();
// return;
//await this.driver.sleep(2000);
logger.info(this.name+"field WalletAddress: ");
await super.clearField(this.fieldWalletAddress);
await super.fillWithWait(this.fieldWalletAddress, address);
// let value=await this.driver.executeScript("document.getElementById('walletAddress')" +
// ".value='kjsdkjwkjwd';");
//await this.driver.sleep(10000000);
await super.clearField(fieldWalletAddress);
await super.fillWithWait(fieldWalletAddress, address);
}
@ -204,10 +214,12 @@ catch(err)
}
async fillMinCap(value){
await this.init();
logger.info(this.name+"MinCap: ");
await super.clearField(this.fieldMinCap,1);
await super.fillWithWait(this.fieldMinCap,value);
await super.clearField(fieldMinCap);
await this.driver.sleep(10000);
await super.fillWithWait(fieldMinCap,value);
await this.driver.sleep(10000);
}
async isPresentWarningMincap(){
logger.info(this.name + "is present warning :");
@ -229,6 +241,7 @@ catch(err)
async isPresentWarningWalletAddress() {
logger.info(this.name + "is present warning :");
return false;
await this.initWarnings();
let s = await super.getTextByElement(this.warningWalletAddress);
if (s != "") { logger.info("present");return true;}
@ -268,7 +281,7 @@ async getFieldWalletAddress(){
logger.info(this.name+"getFieldWalletAddress: ");
try {
await this.init();
let s = super.getAttribute(this.fieldWalletAddress, "value");
let s = super.getAttribute(fieldWalletAddress, "value");
return s;
}
catch (err)

View File

@ -42,11 +42,12 @@ class WizardStep4 extends page.Page{
}
async getABI(){
await this.initFields();
//*[@id="root"]/div/section/div[2]/div[2]/div[7]/div[2]/pre
await this.initFields();
logger.info(this.name+": get ABI: ");
let element = this.fieldTokenABI;
let abi=await super.getTextByElement(element);
abi=JSON.parse(abi);
return abi;
}

View File

@ -1,7 +1,7 @@
{
"name": "TestSuite2.json",
"ticker": "test2",
"name": "ReservedTokens",
"ticker": "test",
"decimals": 18,
"reservedTokens":[
{

28
scenarios/testRA.json Normal file
View File

@ -0,0 +1,28 @@
{
"name": "testRA.json",
"ticker": "RA",
"decimals": 18,
"reservedTokens":[
],
"walletAddress":"0x56B2e3C3cFf7f3921Dc2e0F8B8e20d1eEc29216b",
"gasprice":100,
"mincap": 0,
"whitelisting":false,
"tiers":[
{
"name":"###1",
"allowModify": false,
"startDate": "",
"startTime": "",
"endDate":"15/01/2020",
"endTime":"13:00",
"rate":100,
"supply": 20,
"whitelist":[
]
}]
}

View File

@ -7,7 +7,7 @@
{
"address" :"0xecDFec71AbCD5a612eAf9169B19E907eAA2717d9",
"dimension": "tokens",
"value": 1000.0000007892345
"value": 1000
}
],
"walletAddress":"0x56B2e3C3cFf7f3921Dc2e0F8B8e20d1eEc29216b",

11
test/test3.js Normal file
View File

@ -0,0 +1,11 @@
var assert = require('assert');
var test = require('selenium-webdriver/testing');
const utils=require('../utils/Utils.js');
const Utils=utils.Utils;
let endTime="2018-07-01T15:34";
let newDate="01/07/2018";
let newTime="15:34";
let result = Utils.compare(endTime, newDate, newTime);
console.log(result);

140
test/testRA.js Normal file
View File

@ -0,0 +1,140 @@
const Logger= require('../entity/Logger.js');
const logger=Logger.logger;
const utils=require('../utils/Utils.js');
const Utils=utils.Utils;
const metaMask=require('../pages/MetaMask.js');
const MetaMask=metaMask.MetaMask;
const user=require("../entity/User.js");
const User=user.User;
const crowdsale=require('../entity/Crowdsale.js');
const Crowdsale=crowdsale.Crowdsale;
const acc=require('../entity/Account.js');
const Account=acc.Account;
const currency= require('../entity/Currency.js');
const Currency=currency.Currency;
const reservedTokens=require('../entity/ReservedTokens.js');
const ReservedTokens=reservedTokens.ReservedTokens;
const reservedTokensPage=require('../pages/ReservedTokensPage.js');
const ReservedTokensPage=reservedTokensPage.ReservedTokensPage;
webdriver = require('selenium-webdriver');
var test = require('selenium-webdriver/testing');
var assert = require('assert');
const fs = require('fs-extra');
const eth_wallet=require('ethereumjs-wallet');
const bundleRA=[];
const bundleAccounts=[];
const number=process.argv[2];
const network=process.argv[3];
//testRA();
async function testRA() {
const tempOutputPath='./temp/';
fs.ensureDirSync(tempOutputPath);
const tempOutputFile=tempOutputPath+'resultReservedBundle'+Date.now()+'.json';
fs.ensureFileSync(tempOutputFile);
logger.info("Test: create crowdsale with bundle of reserved tokens");
let driver = await Utils.startBrowserWithMetamask();
let user4_F16AFile='./users/user4_F16A.json';//Rinkeby
let user8545_56B2File='./users/user8545_56B2.json';//Ganache
let user77_56B2File='./users/user77_56B2.json';//Sokol
let Owner;
switch(network)
{
case '4': { Owner = new User (driver,user4_F16AFile);break;}
case '8545':{Owner = new User (driver,user8545_56B2File);break;}
default: {Owner = new User (driver,user77_56B2File);break;}
}
await Utils.increaseBalance(Owner,20);
logger.info("Owner = "+Owner.account);
logger.info("Owner's balance = :"+await Utils.getBalance(Owner)/1e18);
let mtMask = new MetaMask(driver);
await mtMask.activate();//return activated Metamask and empty page
await Owner.setMetaMaskAccount();
var scenario = './scenarios/testRA.json';
let currency=Currency.createCurrency(scenario);
let crowdsale;
crowdsale = await Owner.createCrowdsale(scenario,5,'reserved');
await Owner.open(crowdsale.url);
await driver.sleep(15000);
await Owner.contribute(crowdsale.currency.tiers[0].supply);
await Owner.distribute(crowdsale);
await Owner.finalize(crowdsale);
let obj;
let balance;
let shouldBe;
let isPass=true;
let user= Owner;
for (let i=0;i<bundleRA.length;i++) {
if (bundleRA[i].dimension=='percentage')
shouldBe=bundleRA[i].value*crowdsale.currency.tiers[0].supply/100;
else shouldBe=bundleRA[i].value;
user.account=bundleAccounts[i].address;
user.privateKey=bundleAccounts[i].privateKey;
user.networkID=Owner.networkID;
balance=await user.getTokenBalance(crowdsale)/1e18;
bundleAccounts[i].balance=balance;
isPass=isPass&&(shouldBe==balance);
logger.info("#"+i+" should be:"+ shouldBe+" balance: "+balance+" "+ (shouldBe==balance));
}
logger.info("RESULT: "+isPass);
obj={owner:Owner,crowdsale:crowdsale,accounts:bundleAccounts,isPassTest:isPass};
fs.appendFileSync(tempOutputFile,JSON.stringify(obj));
}
async function generateAccount() {
let obj = eth_wallet.generate();
let address="0x".concat(obj.getAddress().toString('hex'));
let privateKey="0x".concat(obj.getPrivateKey().toString('hex'));
logger.info("Address created: "+address +" ,private key: "+privateKey);
return new Account(address,privateKey);
}
async function fillReservedTokens(driver) {
let account;
let dimension;
let value;
let RA;
logger.info("fill reserved tokens for testRA")
const reservedTokensPage=new ReservedTokensPage(driver);
for (var i=0;i<number;i++) {
account=await generateAccount();
dimension=Math.round(Math.random());
if (dimension==0) dimension='percentage';
else dimension='tokens';
value=Math.trunc(Math.random()*1000);
RA=new ReservedTokens(account.address,dimension,value);
await reservedTokensPage.fillReservedTokens(RA);
await reservedTokensPage.clickButtonAddReservedTokens();
bundleRA[i]=RA;
bundleAccounts[i]=account;
logger.info("#"+i+" Address: "+bundleRA[i].address+" , dimension"+bundleRA[i].dimension+" , value: "+ bundleRA[i].value+" #"+i);
await driver.sleep(1000);
}
let check=await reservedTokensPage.amountAddedReservedTokens();
logger.info("Reserved tokens added: "+check);
logger.info("Reserved tokens should be: "+number);
//await driver.sleep(120000);
}
module.exports.fillReservedTokens=fillReservedTokens;

File diff suppressed because it is too large Load Diff

View File

@ -107,10 +107,10 @@ test.describe('POA token-wizard. Test suite #2', function() {
Investor2 = new User (driver,user8545_f5aAFile);
ReservedAddress = new User (driver,user8545_ecDFFile);
await Utils.sendEth(Owner,20);
await Utils.sendEth(Investor1,20);
await Utils.sendEth(Investor2,20);
await Utils.sendEth(ReservedAddress,20);
await Utils.increaseBalance(Owner,20);
await Utils.increaseBalance(Investor1,20);
await Utils.increaseBalance(Investor2,20);
await Utils.increaseBalance(ReservedAddress,20);
// await deployRegistry(Owner.account);
logger.info("Roles:");
logger.info("Owner = "+Owner.account);
@ -121,7 +121,7 @@ test.describe('POA token-wizard. Test suite #2', function() {
logger.info("Investor2 balance = :"+await Utils.getBalance(Investor2)/1e18);
mtMask = new MetaMask(driver);
await mtMask.open();//return activated Metamask and empty page
await mtMask.activate();//return activated Metamask and empty page
await Owner.setMetaMaskAccount();
welcomePage = new WizardWelcome(driver,startURL);
@ -171,12 +171,12 @@ test.describe('POA token-wizard. Test suite #2', function() {
test.it('User can open wizard welcome page: https://wizard.oracles.org/',
test.it('User can activate wizard welcome page: https://wizard.oracles.org/',
async function () {
b="";
b=await welcomePage.open();
assert.equal(b, startURL, "Test FAILED. User can open Wizard ");
logger.error("Test PASSED. User can open wizard welcome page: https://wizard.oracles.org/");
assert.equal(b, startURL, "Test FAILED. User can activate Wizard ");
logger.error("Test PASSED. User can activate wizard welcome page: https://wizard.oracles.org/");
});
test.it('Welcome page: button NewCrowdsale present ',
@ -195,16 +195,16 @@ test.describe('POA token-wizard. Test suite #2', function() {
logger.error("Test PASSED. Button ChooseContract present");
});
test.it('Welcome page: user is able to open Step1 by clicking button NewCrowdsale ',
test.it('Welcome page: user is able to activate Step1 by clicking button NewCrowdsale ',
async function () {
b=false;
await welcomePage.clickButtonNewCrowdsale();
b= await wizardStep1.isPresentButtonContinue();
assert.equal(b, true, "Test FAILED. User is not able to open Step1 by clicking button NewCrowdsale");
logger.error("Test PASSED. User is able to open Step2 by clicking button NewCrowdsale");
assert.equal(b, true, "Test FAILED. User is not able to activate Step1 by clicking button NewCrowdsale");
logger.error("Test PASSED. User is able to activate Step2 by clicking button NewCrowdsale");
});
test.it('Wizard step#1: user is able to open Step2 by clicking button Continue ',
test.it('Wizard step#1: user is able to activate Step2 by clicking button Continue ',
async function () {
b=false;
let count=10;
@ -219,8 +219,8 @@ test.describe('POA token-wizard. Test suite #2', function() {
}
while (count-->0)
b=await wizardStep2.isPresentFieldName();
assert.equal(b, true, "Test FAILED. User is not able to open Step2 by clicking button Continue");
logger.error("Test PASSED. User is able to open Step2 by clicking button Continue");
assert.equal(b, true, "Test FAILED. User is not able to activate Step2 by clicking button Continue");
logger.error("Test PASSED. User is able to activate Step2 by clicking button Continue");
});
@ -470,14 +470,14 @@ test.describe('POA token-wizard. Test suite #2', function() {
assert.equal(b, true, "Test FAILED. Wizard step#2: button Continue not present ");
});
test.it('Wizard step#2: user is able to open Step3 by clicking button Continue ',
test.it('Wizard step#2: user is able to activate Step3 by clicking button Continue ',
async function () {
b=false;
await wizardStep2.clickButtonContinue();
await driver.sleep(2000);
b=await wizardStep3.isPresentFieldWalletAddress();
assert.equal(b, true, "Test FAILED. User is not able to open Step2 by clicking button Continue");
logger.error("Test PASSED. User is able to open Step3 by clicking button Continue");
assert.equal(b, true, "Test FAILED. User is not able to activate Step2 by clicking button Continue");
logger.error("Test PASSED. User is able to activate Step3 by clicking button Continue");
});

View File

@ -11,6 +11,10 @@ const fs = require('fs');
const Web3 = require('web3');
const {spawn} = require('child_process');
const configFile='config.json';
const crowdsale=require('../entity/Crowdsale.js');
const Crowdsale=crowdsale.Crowdsale;
var browserHandles=[];
@ -42,7 +46,7 @@ static async getProviderUrl(id)
}
static async sendEth(user,amount)
static async increaseBalance(user, amount)
{
try{
let provider=await Utils.getProviderUrl(user.networkID);
@ -113,8 +117,8 @@ static async wait(driver,time){
var mailOptions = {
from: 'testresults39@gmail.com',
to: 'dennistikhomirov@gmail.com',
subject: 'test results '+Utils.getDateNear(0,'utc')+" "+ Utils.getTimeNear(0,'utc'),
text: 'test results '+Utils.getDateNear(0,'utc') + " " + Utils.getTimeNear(0,'utc'),
subject: 'test results '+Utils.getDateWithAdjust(0,'utc')+" "+ Utils.getTimeWithAdjust(0,'utc'),
text: 'test results '+Utils.getDateWithAdjust(0,'utc') + " " + Utils.getTimeWithAdjust(0,'utc'),
attachments: [
{path:""}
]
@ -197,7 +201,7 @@ return s[0]+":"+s[1].substring(0,2);
static getTimeNear(adj,format){
static getTimeWithAdjust(adj, format){
var d=new Date(Date.now()+adj);
var r="am";
@ -219,7 +223,7 @@ return s[0]+":"+s[1].substring(0,2);
var q=h+":"+min+r;
return q;
}
static getDateNear(adj,format){
static getDateWithAdjust(adj, format){
var d=new Date(Date.now()+adj);
var q;
@ -289,15 +293,26 @@ return q;
}
getScenarioFile(fileName) {
var obj = JSON.parse(fs.readFileSync(fileName, "utf8"));
return obj.scenario;
}
static async zoom(driver,z){
await driver.executeScript ("document.body.style.zoom = '"+z+"'");
}
static async getCrowdsaleInstance(fileName) {
try {
let crowdsale = new Crowdsale();
await crowdsale.parser(fileName);
return crowdsale;
}
catch(err) {
logger.info("Can not create crowdsale");
logger.info(err);
return null;
}
}
}
module.exports={
Utils:Utils