]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/commitdiff
Test suite using phantomjs
authorIan Coleman <coleman.ian@gmail.com>
Tue, 23 Aug 2016 04:59:47 +0000 (14:59 +1000)
committerIan Coleman <coleman.ian@gmail.com>
Tue, 23 Aug 2016 04:59:47 +0000 (14:59 +1000)
readme.md
tests.js [new file with mode: 0644]

index 210703b3bb6fd4a32fc354b308d0115ffcf73e0c..02e1e18c202b1ff4a802313d559194f564f3a84c 100644 (file)
--- 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 (file)
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();