浏览代码

HUE-937 [oozie] JS Test cases for loading and saving a workflow

- Added a method that serializes workflow data for better testing.
abec 13 年之前
父节点
当前提交
69ff61d

+ 1 - 15
apps/oozie/src/oozie/templates/editor/edit_workflow.mako

@@ -520,24 +520,10 @@ $.extend(Workflow.prototype, {
 
     var options = options || {};
 
-    data = $.extend(true, {}, self.model);
-
-    var nodes = [];
-    $.each(self.registry.nodes, function(key, node) {
-      // Create object with members from the actual model to address JSON.stringify bug
-      // JSON.stringify does not pick up members specified in prototype prior to object creation.
-      var model = {};
-      for (var key in node.model) {
-        model[key] = node.model[key];
-      }
-      nodes.push(model);
-    });
-    data['nodes'] = nodes;
-
     var request = $.extend({
       url: self.url() + '/save',
       type: 'POST',
-      data: { workflow: JSON.stringify(data) },
+      data: { workflow: self.toJSON() },
       success: function() {
         $.jHueNotify.info("${ _('Workflow saved') }");
         workflow.is_dirty( false );

+ 99 - 8
apps/oozie/static/jasmine/workflow.js

@@ -1,7 +1,7 @@
 
 describe("WorkflowModel", function(){
 
-  function create_three_step_workflow() {
+  function create_three_step_workflow(workflow_id) {
     var workflow_model = new WorkflowModel({
       id: 1,
       name: "Test-Three-Step-Workflow",
@@ -14,7 +14,7 @@ describe("WorkflowModel", function(){
       data: {
         "nodes":[{
             "description":"",
-            "workflow":1,
+            "workflow":workflow_id,
             "child_links":[{
                 "comment":"",
                 "name":"to",
@@ -32,7 +32,7 @@ describe("WorkflowModel", function(){
           },{
             "id":2,
             "name":"Sleep-1",
-            "workflow":1,
+            "workflow":workflow_id,
             "node_type":"mapreduce",
             "jar_path":"/user/hue/oozie/workspaces/lib/hadoop-examples.jar",
             "child_links":[{
@@ -49,7 +49,7 @@ describe("WorkflowModel", function(){
         },{
           "id":3,
           "name":"Sleep-2",
-          "workflow":1,
+          "workflow":workflow_id,
           "node_type":"mapreduce",
           "jar_path":"/user/hue/oozie/workspaces/lib/hadoop-examples.jar",
           "child_links":[{
@@ -66,7 +66,7 @@ describe("WorkflowModel", function(){
         },{
           "id":4,
           "name":"Sleep-3",
-          "workflow":1,
+          "workflow":workflow_id,
           "node_type":"mapreduce",
           "jar_path":"/user/hue/oozie/workspaces/lib/hadoop-examples.jar",
           "child_links":[{
@@ -83,14 +83,14 @@ describe("WorkflowModel", function(){
         },{
           "id":6,
           "name":"kill",
-          "workflow":1,
+          "workflow":workflow_id,
           "node_type":"kill",
           "child_links":[],
           "message":"Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]",
         },{
           "id":5,
           "name":"end",
-          "workflow":1,
+          "workflow":workflow_id,
           "node_type":"end",
           "child_links":[],
         }],
@@ -100,9 +100,100 @@ describe("WorkflowModel", function(){
     return workflow;
   }
 
+  function create_pig_workflow(workflow_id) {
+    var workflow_model = new WorkflowModel({
+      id: 1,
+      name: "Test-pig-Workflow",
+      start: 1,
+      end: 5
+    });
+    var registry = new Registry();
+    var workflow = new Workflow({
+      model: workflow_model,
+      data: {
+        "nodes":[{
+            "description":"",
+            "workflow":workflow_id,
+            "child_links":[{
+                "comment":"",
+                "name":"to",
+                "parent":1,
+                "child":2
+              },{
+                "comment":"",
+                "name":"related",
+                "parent":1,
+                "child":5
+            }],
+            "node_type":"start",
+            "id":1,
+            "name":"start"
+          },{
+            "id":2,
+            "name":"Pig-1",
+            "workflow":workflow_id,
+            "node_type":"pig",
+            "script_path":"test.pig",
+            "child_links":[{
+                "comment":"",
+                "name":"ok",
+                "parent":2,
+                "child":3
+              },{
+                "comment":"",
+                "name":"error",
+                "parent":2,
+                "child":4
+              }],
+        },{
+          "id":4,
+          "name":"kill",
+          "workflow":workflow_id,
+          "node_type":"kill",
+          "child_links":[],
+          "message":"Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]",
+        },{
+          "id":3,
+          "name":"end",
+          "workflow":workflow_id,
+          "node_type":"end",
+          "child_links":[],
+        }],
+      },
+      registry: registry
+    });
+    return workflow;
+  }
+
+  describe("Workflow operations", function(){
+    var json = '{"id":1,"name":"Test-pig-Workflow","start":1,"end":5,"description":"","schema_version":0.4,"deployment_dir":"","is_shared":true,"parameters":"[]","job_xml":"","nodes":[{"description":"","workflow":1,"child_links":[{"comment":"","name":"to","parent":1,"child":2},{"comment":"","name":"related","parent":1,"child":5}],"node_type":"start","id":1,"name":"start"},{"id":2,"name":"Pig-1","workflow":1,"node_type":"pig","script_path":"test.pig","child_links":[{"comment":"","name":"ok","parent":2,"child":3},{"comment":"","name":"error","parent":2,"child":4}],"description":"","files":"[]","archives":"[]","job_properties":"[]","prepares":"[]","job_xml":"","params":"[]"},{"id":4,"name":"kill","workflow":1,"node_type":"kill","child_links":[],"message":"Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]","description":""},{"id":3,"name":"end","workflow":1,"node_type":"end","child_links":[],"description":""}]}';
+    var node = null;
+    var viewModel = create_pig_workflow(1);
+    viewModel.rebuild();
+
+    it("Ensure serialized data sent to server is proper", function() {
+      expect(viewModel.toJSON()).toEqual(json);
+    });
+
+    it("Ensure data received from server can be loaded", function() {
+      viewModel.reload($.parseJSON(json.replace('test.pig','test1.pig')));
+      expect(viewModel.id()).toEqual(1);
+      expect(viewModel.name()).toEqual('Test-pig-Workflow');
+      expect(viewModel.start()).toEqual(1);
+      expect(viewModel.description()).toEqual("");
+      expect(viewModel.schema_version()).toEqual(0.4);
+      expect(viewModel.deployment_dir()).toEqual("");
+      expect(viewModel.is_shared()).toEqual(true);
+      expect(viewModel.parameters().length).toEqual(0);
+      expect(viewModel.job_xml()).toEqual("");
+      expect(viewModel.nodes().length).toEqual(3);
+      expect(viewModel.nodes()[1].script_path()).toEqual('test1.pig');
+    });
+  });
+
   describe("Node APIs", function(){
     var node = null;
-    var viewModel = create_three_step_workflow();
+    var viewModel = create_three_step_workflow(2);
     viewModel.rebuild();
 
     it("Should be able to detach a node", function() {

+ 19 - 0
apps/oozie/static/js/workflow.js

@@ -1903,6 +1903,25 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
     },
 
     // Data manipulation
+    toJSON: function() {
+      var self = this;
+
+      data = $.extend(true, {}, self.model);
+
+      var nodes = [];
+      $.each(self.registry.nodes, function(key, node) {
+        // Create object with members from the actual model to address JSON.stringify bug
+        // JSON.stringify does not pick up members specified in prototype prior to object creation.
+        var model = {};
+        for (var key in node.model) {
+          model[key] = node.model[key];
+        }
+        nodes.push(model);
+      });
+      data['nodes'] = nodes;
+
+      return JSON.stringify(data);
+    },
 
     save: function( options ) {},