update the tests to use a new common driver, and add a new rewriter crud test
diff --git a/client/test/commands/createAndDelete.js b/client/test/commands/createAndDelete.js
index f842ec3..99fe27a 100644
--- a/client/test/commands/createAndDelete.js
+++ b/client/test/commands/createAndDelete.js
@@ -1,33 +1,6 @@
-var uuid = require('uuid');
+import it from '../helpers/driver'
 
-import {test as it} from 'ava'
-const spawn = require('child_process').spawn
-
-it('should create and delete an action and quit without error', t => {
-    return new Promise((resolve,reject) => {
-	var child = spawn('node', ['wskdb.js'], { cwd: '../..' })
-	var name = uuid.v4();
-	child.stdin.write('create ' + name + ' nodejs function main(params) { return { message: "Hello " + params.name } }\n')
-	child.stdin.write('delete ' + name + '\n');
-	child.stdin.write('q\n');
-
-	child.stderr.on('data', (data) => {
-	    console.error('stderr: ' + data)
-	})
-
-	var goody = false;
-	child.stdout.on('data', (data) => {
-	    // console.log('stdout: ' + data);
-	    if (data.indexOf('Error') >= 0) {
-		goody = false
-
-	    } else if (data.indexOf('ok') >= 0) {
-		goody = true
-	    }
-	});
-	child.on('exit', (code) => {
-	    if (code == 0 && goody) resolve()
-	    else reject('code=${code} goody=${goody}')
-	});
-    }).then(result => t.is(result))
-});
+it('should create and delete an action, and then quit without error', (name) => [
+    `create ${name} nodejs function main(params) { return { message: "Hello " + params.name } }`,
+    `delete ${name}`
+])
diff --git a/client/test/helpers/driver.js b/client/test/helpers/driver.js
new file mode 100644
index 0000000..19035a0
--- /dev/null
+++ b/client/test/helpers/driver.js
@@ -0,0 +1,57 @@
+'use strict'
+
+var test = require('ava').test;
+const uuid = require('uuid');
+const spawn = require('child_process').spawn;
+
+function Driver() {
+}
+Driver.prototype.it = function it(shouldDoThisSuccessfully, stepFn, rootPath) {
+    test(shouldDoThisSuccessfully, t => {
+	return new Promise((resolve,reject) => {
+	    const child = spawn('node', ['wskdb.js'], { cwd: rootPath || '../..' });
+
+		var name = uuid.v4();
+		var steps = stepFn(name);
+	    
+		var stepNumber = 0;
+		var goody = false;
+	    
+		function doStep() {
+		    child.stdin.write(steps[stepNumber++] + '\n');
+		}
+		doStep(); // do the first step
+		
+		child.stderr.on('data', (data) => {
+		    console.error('stderr: ' + data);
+		});
+		
+		child.stdout.on('data', (data) => {
+		    //console.log('stdout: ' + data)
+		    if (data.indexOf('Error') >= 0) {
+			goody = false;
+			reject('Step ' + (stepNumber - 1) + ' failed');
+			
+		    } else if (data.indexOf('ok') >= 0) {
+			goody = true;
+			
+			if (stepNumber === steps.length) {
+			    child.stdin.write('quit\n');
+			    child.stdin.end();
+			} else {
+			    doStep();
+			}
+		    }
+		});
+		child.on('exit', (code) => {
+		    if (code === 0 && goody) {
+			resolve();
+		    } else {
+			reject('code=${code} goody=${goody}');
+		    }
+		});
+	    }).then(result => t.is(result));
+	});
+} /* the end of it! */
+
+module.exports = new Driver().it;
diff --git a/client/test/rewriter/createAttachDetachDelete.js b/client/test/rewriter/createAttachDetachDelete.js
new file mode 100644
index 0000000..8e0218c
--- /dev/null
+++ b/client/test/rewriter/createAttachDetachDelete.js
@@ -0,0 +1,8 @@
+import it from '../helpers/driver'
+
+it('should create an attach, then attach, detach, delete, and finally quit without error', (name) => [
+    `create ${name} nodejs function main(params) { return { message: "Hello " + params.name } }`,
+    `attach ${name}`,
+    `detach ${name}`,
+    `delete ${name}`
+]);