').data('json-obj', detailView.context.testListView[0]).appendTo($listView);
    var $cloudStackContainer = $('
').attr('cloudStack-container', true).data('cloudStack-args', {
      sections: {
        testListView: {}
      }
    }).appendTo('#qunit-fixture');
    $.fn.dataTable = function() { return this; };
    $.fn.listView = function(args1, args2) {
      if (args1 == 'replaceItem')
        args2.after(args2.$row.data('json-obj', args2.data));
      return this;
    };
    
    cloudStack.ui.notifications.add = function(notification, complete) {
      complete();
    };
    cloudStack.dialog.confirm = function(args) {
      args.action();
    };
    $detailView.data('list-view-row', $listViewRow);
    $detailView.detailView(detailView);
    stop();
    $detailView.find('.action.updateDataTestSync a').click();
  });
  test('Update data async, from list view row', function() {
    var detailView = {
      section: 'testListView',
      context: {
        testListView: [{
          fieldA: 'fieldA-1',
          fieldB: 'fieldB-1',
          fieldC: 'fieldC-1',
          state: 'on'
        }]
      },
      actions: {
        updateDataTestAsync: {
          label: 'updateDataTestAsync',
          preAction: function(args) {
            start();
            ok(true, 'Pre-action called');
            equal($detailView.data('view-args').context.testListView[0].fieldA, 'fieldA-1', 'Pre-action: Correct context value for fieldA');
            equal($detailView.data('view-args').context.testListView[0].fieldB, 'fieldB-1', 'Pre-action: Correct context value for fieldB');
            equal($detailView.data('view-args').context.testListView[0].fieldC, 'fieldC-1', 'Pre-action: Correct context value for fieldC');
            stop();
            return true;
          },
          action: function(args) {
            args.response.success();
          },
          messages: { notification: function() { return 'notification'; }},
          notification: {
            poll: function(args) {
              args.complete({
                data: {
                  fieldA: 'fieldA-2',
                  fieldB: 'fieldB-2',
                  state: 'off'
                }
              });
              start();
              equal($detailView.data('view-args').context.testListView[0].fieldA, 'fieldA-2', 'Correct context value for fieldA');
              equal($detailView.data('view-args').context.testListView[0].fieldB, 'fieldB-2', 'Correct context value for fieldB');
              equal($detailView.data('view-args').context.testListView[0].fieldC, 'fieldC-1', 'Correct context value for fieldC');
              equal($detailView.find('tr.fieldA .value').html(), 'fieldA-2', 'Correct table value for fieldA');
              equal($detailView.find('tr.fieldB .value').html(), 'fieldB-2', 'Correct table value for fieldB');
              equal($detailView.find('tr.fieldC .value').html(), 'fieldC-1', 'Correct table value for fieldC');
              equal($detailView.find('.action').size(), 1, 'Correct action count');
              equal($detailView.find('.action.updateDataTestAsync').size(), 1, 'updateDataTestAsync present');
              equal($detailView.find('.action.filteredAction').size(), 0, 'filteredAction not present');
              stop();
            }
          }
        },
        filteredAction: {
          label: 'filteredAction',
          action: function() {},
          messages: { notification: function() { return 'notification'; } }
        }
      },
      tabs: {
        test: {
          title: 'test',
          fields: [{
            fieldA: { label: 'fieldA' },
            fieldB: { label: 'fieldB' },
            fieldC: { label: 'fieldC' }
          }],
          dataProvider: function(args) {
            args.response.success({
              data: args.context.testListView[0],
              actionFilter: function(args) {
                if (args.context.testListView[0].state == 'on') {
                  return ['updateDataTestAsync', 'filteredAction'];
                }
                return ['updateDataTestAsync'];
              }
            });
          }
        }
      }
    };
    var $detailView = $('
');
    var $listView = $('
').addClass('list-view');
    var $listViewRow = $('
').data('json-obj', detailView.context.testListView[0]).appendTo($listView);
    var $cloudStackContainer = $('
').attr('cloudStack-container', true).data('cloudStack-args', {
      sections: {
        testListView: {}
      }
    }).appendTo('#qunit-fixture');
    $.fn.dataTable = function() { return this; };
    $.fn.listView = function(args1, args2) {
      if (args1 == 'replaceItem')
        args2.after(args2.$row.data('json-obj', args2.data));
      return this;
    };
    
    cloudStack.ui.notifications.add = function(notification, complete) {
      notification.poll({ complete: complete });
    };
    cloudStack.dialog.confirm = function(args) {
      args.action();
    };
    $detailView.data('list-view-row', $listViewRow);
    $detailView.detailView(detailView);
    equal($detailView.find('.action').size(), 2, 'Correct action count');
    equal($detailView.find('.action.updateDataTestAsync').size(), 1, 'updateDataTestAsync present');
    equal($detailView.find('.action.filteredAction').size(), 1, 'filteredAction present');
    
    stop();    
    $detailView.find('.action.updateDataTestAsync a').click();
    $detailView.data('view-args').actions.updateDataTestAsync.preAction = function(args) {
      start();
      equal($detailView.data('view-args').context.testListView[0].fieldA, 'fieldA-2', 'Pre-action: Correct context value for fieldA');
      equal($detailView.data('view-args').context.testListView[0].fieldB, 'fieldB-2', 'Pre-action: Correct context value for fieldB');
      equal($detailView.data('view-args').context.testListView[0].fieldC, 'fieldC-1', 'Pre-action: Correct context value for fieldC');
      ok(true, 'Pre-action called');
      return false;
    };
    $detailView.find('.action.updateDataTestAsync a').click();
  });
  test('Update context', function() {
    var detailView = {
      context: {
        listViewItemA: [
          { fieldA: 'fieldAContent' }
        ]
        // listViewItemB [not stored yet]
      },
      tabFilter: function(args) {
        start();
        ok($.isArray(args.context.listViewItemB), 'updateContext called before tabFilter');
        stop();
        return [];
      },
      // updateContext is executed every time a data provider is called
      updateContext: function(args) {
        start();
        ok(true, 'updateContext called');
        equal(args.context.listViewItemA[0].fieldA, 'fieldAContent', 'updateContext: Item A present in context');
        stop();
        return {
          listViewItemB: [
            { fieldB: 'fieldBContent' }
          ]
        };
      },
      tabs: {
        test: {
          title: 'test',
          fields: { fieldA: { label: 'fieldA'}, fieldB: { label: 'fieldB' }},
          dataProvider: function(args) {
            start();
            equal(args.context.listViewItemA[0].fieldA, 'fieldAContent', 'dataProvider: Item A present in context');
            equal(args.context.listViewItemB[0].fieldB, 'fieldBContent', 'dataProvider: Item B present in context');
          }
        }
      }
    };
    var $detailView = $('
');
    stop();
    $detailView.detailView(detailView);
  });
}(jQuery));