[CORD-1133] E2E GUI Tests

Change-Id: I521d0cc068a3e328f3d4f421ba4b342bea167e19
diff --git a/e2e/crud/crud.po.js b/e2e/crud/crud.po.js
new file mode 100644
index 0000000..6568819
--- /dev/null
+++ b/e2e/crud/crud.po.js
@@ -0,0 +1,21 @@
+module.exports = new function(){
+
+  // list view
+  this.tableRows = element.all(by.repeater('item in vm.data'));
+  this.tableColumn = element(by.repeater('item in vm.data').row(0))
+                      .all(by.repeater('col in vm.columns'));
+
+  this.actionsColumn = element(by.repeater('item in vm.data').row(0))
+    .element(by.css('td:last-child'));
+
+  this.deleteBtn = this.actionsColumn.all(by.tagName('a'));
+
+  this.addBtn = element(by.linkText('Add'));
+
+  // detail page
+  this.formInputs = element.all(by.repeater('field in vm.config.inputs'));
+  this.formBtn = element(by.buttonText('Save'));
+
+  this.nameField = element(by.css('[name="name"]'));
+  this.successFeedback = element(by.css('.alert.alert-success'));
+};
diff --git a/e2e/crud/crud.spec.js b/e2e/crud/crud.spec.js
new file mode 100644
index 0000000..f3660b4
--- /dev/null
+++ b/e2e/crud/crud.spec.js
@@ -0,0 +1,51 @@
+const user = require('../test_helpers/user');
+const page = require('./crud.po');
+const config = require('../test_helpers/config');
+
+describe('XOS CRUD Page', function() {
+
+  beforeEach((done) => {
+    user.login()
+      .then(() => {
+        done();
+      });
+  });
+
+  describe('list view', () => {
+    beforeEach(() => {
+      browser.get(`${config.url}/core/nodes/`);
+    });
+    it('should have a table', () => {
+      expect(page.tableRows.count()).toBe(2);
+      expect(page.tableColumn.count()).toBe(5);
+      expect(page.deleteBtn.count()).toBe(1); // per row
+    });
+
+    it('should have an add button', () => {
+      expect(page.addBtn.isDisplayed()).toBeTruthy();
+      page.addBtn.click();
+      expect(browser.getCurrentUrl()).toBe(`${config.url}/core/nodes/add`);
+    });
+  });
+
+  describe('details view', () => {
+
+    describe('for an existing model', () => {
+      beforeEach(() => {
+        browser.get(`${config.url}/core/nodes/1`);
+      });
+      it('should have a form', () => {
+        expect(page.formInputs.count()).toBe(5);
+        expect(page.formBtn.isPresent()).toBeTruthy();
+      });
+
+      it('should save the model', () => {
+        page.nameField.clear().sendKeys('test');
+        page.formBtn.click();
+        expect(page.nameField.getAttribute('value')).toBe('test');
+        expect(page.successFeedback.isDisplayed()).toBeTruthy();
+        browser.sleep(3000)
+      });
+    })
+  });
+});
\ No newline at end of file