reserved tokens test
This commit is contained in:
parent
fca9c6f551
commit
5683cffb7a
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"startURL" : "http://localhost:3000/",
|
||||
"startURL" : "https://wizard.oracles.org/",
|
||||
"outputPath":"./results",
|
||||
"installMetaMask":true
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
'use strict';
|
||||
|
||||
class Account {
|
||||
|
||||
constructor(address,privateKey){
|
||||
this.address=address;
|
||||
this.privateKey=privateKey;
|
||||
this.balance;
|
||||
}
|
||||
}
|
||||
module.exports.Account=Account;
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
*/
|
|
@ -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;
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
1112
entity/User.js
1112
entity/User.js
File diff suppressed because it is too large
Load Diff
4
index.js
4
index.js
|
@ -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);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
11
package.json
11
package.json
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(){
|
||||
|
|
|
@ -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);
|
||||
|
|
631
pages/Page.js
631
pages/Page.js
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
|
||||
"name": "TestSuite2.json",
|
||||
"ticker": "test2",
|
||||
"name": "ReservedTokens",
|
||||
"ticker": "test",
|
||||
"decimals": 18,
|
||||
"reservedTokens":[
|
||||
{
|
||||
|
|
|
@ -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":[
|
||||
|
||||
]
|
||||
}]
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
{
|
||||
"address" :"0xecDFec71AbCD5a612eAf9169B19E907eAA2717d9",
|
||||
"dimension": "tokens",
|
||||
"value": 1000.0000007892345
|
||||
"value": 1000
|
||||
}
|
||||
],
|
||||
"walletAddress":"0x56B2e3C3cFf7f3921Dc2e0F8B8e20d1eEc29216b",
|
||||
|
|
|
@ -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);
|
|
@ -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;
|
1311
test/testSuite1.js
1311
test/testSuite1.js
File diff suppressed because it is too large
Load Diff
|
@ -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");
|
||||
|
||||
});
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue