From 88e2cdaa545ad7f7fac0256e33e5aeeb6276bc34 Mon Sep 17 00:00:00 2001 From: Ian Coleman Date: Tue, 23 Aug 2016 14:59:47 +1000 Subject: [PATCH] Test suite using phantomjs --- readme.md | 10 +++ tests.js | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 217 insertions(+) create mode 100644 tests.js diff --git a/readme.md b/readme.md index 210703b..02e1e18 100644 --- a/readme.md +++ b/readme.md @@ -34,3 +34,13 @@ Please do not make modifications to `bip39-standalone.html`, since they will be overwritten by `compile.py`. Make changes in `src/*` and apply them using the command `python compile.py` + +# Tests + +Tests depend on [phantomjs](http://phantomjs.org/). + +Run tests from the command-line + +``` +$ phantomjs tests.js +``` diff --git a/tests.js b/tests.js new file mode 100644 index 0000000..12b779e --- /dev/null +++ b/tests.js @@ -0,0 +1,207 @@ +// Usage: +// $ phantomjs tests.js + + +var page = require('webpage').create(); +var url = 'src/index.html'; + +page.onResourceError = function(e) { + console.log("Error loading " + e.url); + phantom.exit(); +} + +function fail() { + console.log("Failed"); + phantom.exit(); +} + +function next() { + if (tests.length > 0) { + var testsStr = tests.length == 1 ? "test" : "tests"; + console.log(tests.length + " " + testsStr + " remaining"); + tests.shift()(); + } + else { + console.log("Finished with 0 failures"); + phantom.exit(); + } +} + +tests = [ + +// Page loads with status of 'success' +function() { +page.open(url, function(status) { + if (status != "success") { + console.log("Page did not load with status 'success'"); + fail(); + } + next(); +}); +}, + +// Page has text +function() { +page.open(url, function(status) { + var content = page.evaluate(function() { + return document.body.textContent.trim(); + }); + if (!content) { + console.log("Page does not have text"); + fail(); + } + next(); +}); +}, + +// Entering mnemonic generates addresses +function() { +page.open(url, function(status) { + var expected = "1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug"; + // set the phrase + page.evaluate(function() { + $(".phrase").val("abandon abandon ability").trigger("input"); + }); + // get the address + setTimeout(function() { + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("Mnemonic did not generate address"); + console.log("Expected: " + expected); + console.log("Got: " + actual); + fail(); + } + next(); + }, 1000); +}); +}, + +// Random button generates random mnemonic +function() { +page.open(url, function(status) { + // check initial phrase is empty + var phrase = page.evaluate(function() { + return $(".phrase").text(); + }); + if (phrase != "") { + console.log("Initial phrase is not blank"); + fail(); + } + // press the 'generate' button + page.evaluate(function() { + $(".generate").click(); + }); + // get the new phrase + setTimeout(function() { + var phrase = page.evaluate(function() { + return $(".phrase").val(); + }); + if (phrase.length <= 0) { + console.log("Phrase not generated by pressing button"); + fail(); + } + next(); + }, 1000); +}); +}, + +// Mnemonic length can be customized +function() { +page.open(url, function(status) { + // set the length to 6 + var expectedLength = 6; + page.evaluate(function() { + $(".strength").val(expectedLength); + }); + // press the 'generate' button + page.evaluate(function() { + $(".generate").click(); + }); + // check the new phrase is six words long + setTimeout(function() { + var actualLength = page.evaluate(function() { + var words = $(".phrase").val().split(" "); + return words.length; + }); + if (actualLength != expectedLength) { + console.log("Phrase not generated with correct length"); + console.log("Expected: " + expectedLength); + console.log("Actual: " + actualLength); + fail(); + } + }, 200); + next(); +}); +}, + +// TODO finish these tests + +// Passphrase can be set +// Network can be set to bitcoin testnet +// Network can be set to litecoin +// Network can be set to dogecoin +// Network can be set to shadowcash +// Network can be set to shadowcash testnet +// Network can be set to viacoin +// Network can be set to viacoin testnet +// Network can be set to jumbucks +// Network can be set to clam +// BIP39 seed is set from phrase +// BIP32 root key is set from phrase + +// Tabs show correct addresses when changed + +// BIP44 derivation path is shown +// BIP44 extended private key is shown +// BIP44 extended public key is shown +// BIP44 purpose field changes address list +// BIP44 coin field changes address list +// BIP44 account field changes address list +// BIP44 external/internal field changes address list + +// BIP32 derivation path can be set +// BIP32 can use hardened derivation paths +// BIP32 extended private key is shown +// BIP32 extended public key is shown + +// Derivation path is shown in table +// Derivation path for address can be hardened +// Derivation path visibility can be toggled +// Address is shown +// Addresses are shown in order of derivation path +// Address visibility can be toggled +// Private key is shown +// Private key visibility can be toggled + +// More addresses can be generated +// A custom number of additional addresses can be generated +// Additional addresses are shown in order of derivation path + +// BIP32 root key can be set by the user +// Setting BIP32 clears the existing phrase, passphrase and seed +// Custom BIP32 root key is used when changing the derivation path + +// Incorrect mnemonic shows error +// Incorrect word shows suggested replacement +// Incorrect BIP32 root key shows error +// Derivation path not starting with m shows error +// Derivation path containing invalid characters shows useful error + +// Github Issue 11: Default word length is 15 +// https://github.com/dcpos/bip39/issues/11 + +// Github Issue 12: Generate more rows with private keys hidden +// https://github.com/dcpos/bip39/issues/12 + +// Github Issue 19: Mnemonic is not sensitive to whitespace +// https://github.com/dcpos/bip39/issues/19 + +// Github Issue 23: Use correct derivation path when changing tabs +// https://github.com/dcpos/bip39/issues/23 + +]; + +console.log("Running tests..."); +next();