4831: Set initial values for filters.
authorTom Clegg <tom@curoverse.com>
Wed, 31 Dec 2014 06:56:10 +0000 (01:56 -0500)
committerTom Clegg <tom@curoverse.com>
Wed, 31 Dec 2014 06:56:10 +0000 (01:56 -0500)
apps/backstage/app/filter.js
apps/backstage/test/mithril-dom.js [new file with mode: 0644]
apps/backstage/test/unit/filter.js

index 1da615917e871f593fba9c585e243e3f95d72907..19c95bc7323a19f43c95f6a7236d9432b3757336 100644 (file)
@@ -9,8 +9,12 @@ function FilterAnyText() {
     this.view = function(ctrl) {
         return m('.input-group.input-group-sm', [
             m('input.form-control[type="text"][placeholder="Search"]',
-              {oninput: m.withAttr('value', setFilter)}),
+              {value: getFilter(),
+               oninput: m.withAttr('value', setFilter)}),
         ]);
+        function getFilter() {
+            return ctrl.currentFilter() ? ctrl.currentFilter()[2].replace(/^%(.*)%$/, '$1') : ''
+        }
         function setFilter(value) {
             ctrl.currentFilter('any', 'ilike', '%'+value+'%')
         }
@@ -29,10 +33,10 @@ function FilterObjectType(opts) {
                     ]),
                     m('ul.dropdown-menu[role="menu"]', [
                         m('li', [
-                            m('a[href="#"]', {onclick: ctrl.currentFilter.bind(ctrl, opts.attr, 'is_a', 'arvados#collection')}, 'Collection'),
+                            m('a[href="#"][data-value="arvados#collection"]', {onclick: ctrl.currentFilter.bind(ctrl, opts.attr, 'is_a', 'arvados#collection')}, 'Collection'),
                         ]),
                         m('li', [
-                            m('a[href="#"]', {onclick: ctrl.currentFilter.bind(ctrl, opts.attr, 'is_a', 'arvados#pipelineInstance')}, 'Pipeline instance'),
+                            m('a[href="#"][data-value="arvados#pipelineInstance"]', {onclick: ctrl.currentFilter.bind(ctrl, opts.attr, 'is_a', 'arvados#pipelineInstance')}, 'Pipeline instance'),
                         ]),
                     ]),
                 ]),
diff --git a/apps/backstage/test/mithril-dom.js b/apps/backstage/test/mithril-dom.js
new file mode 100644 (file)
index 0000000..6b92b49
--- /dev/null
@@ -0,0 +1,10 @@
+var $ = require('jquery')
+, m = require('mithril');
+
+module.exports = md;
+
+function md(cell) {
+    var div = $('<div></div>')[0];
+    m.render(div, cell);
+    return div.children;
+}
index 375647157d7b730c16c5fdac170f4b7c13213246..d8ffd5ed0f7d4048f794d8ec5916a758a62d1d83 100644 (file)
@@ -1,40 +1,57 @@
-var mq = require('mithril-query')
-, Filter = require('app/filter')
+var Filter = require('app/filter')
+, chai = require('chai')
+, m = require('mithril')
+, md = require('test/mithril-dom')
+, mq = require('mithril-query')
 , sinon = require('sinon')
+, $ = require('jquery')
+, c = chai
 , s = sinon;
 
 suite('Filter', function() {
-    function setup(filterClass) {
+    function setup(filterClass, initialFilter) {
         var f = {};
         f.tested = new filterClass({attr: 'fakeAttr'});
-        f.cfSpy = sinon.spy();
+        f.cfSpy = sinon.stub();
+        f.cfSpy.withArgs().returns(initialFilter);
         f.ctrl = {currentFilter: f.cfSpy};
         f.rendered = f.tested.view(f.ctrl);
         f.domfrag = mq(f.rendered);
         return f;
     }
     suite('AnyText', function() {
-        test.skip("default is existing filter value", function() {
-            // TODO
+        test("default is existing filter value", function() {
+            f = setup(Filter.AnyText, ['any','ilike','%quux%']);
+            f.rendered = f.tested.view(f.ctrl);
+            f.domfrag = mq(f.rendered);
+            c.assert.equal(f.domfrag.first('input').attrs.value, "quux");
         });
         test("fires currentFilter on input change", function() {
             f = setup(Filter.AnyText);
-            // XXX: should call once to retrieve current filter value
-            // s.assert.calledWith(f.cfSpy);
             f.domfrag.setValue('input', 'qux');
             // Should call again to set new filter value
             s.assert.calledWith(f.cfSpy, 'any', 'ilike', '%qux%');
         });
     });
     suite('ObjectType', function() {
-        test.skip("default is existing filter value", function() {
-            // TODO
+        test("default is existing filter value", function() {
+            f = setup(Filter.ObjectType, ['fakeAttr','is_a','arvados#collection']);
+            f.rendered = f.tested.view(f.ctrl);
+            f.md = md(f.rendered);
+            c.assert.lengthOf($('.dropdown-toggle:contains(Type)', f.md), 0);
+            c.assert.lengthOf($('.dropdown-toggle:contains(collection)', f.md), 1);
+        });
+        test("show generic label if no existing filter value", function() {
+            f = setup(Filter.ObjectType, undefined);
+            f.rendered = f.tested.view(f.ctrl);
+            f.md = md(f.rendered);
+            c.assert.lengthOf($('.dropdown-toggle:contains(Type)', f.md), 1);
         });
         test("fires currentFilter on selection", function() {
             f = setup(Filter.ObjectType);
-            f.domfrag.click('li a');
+            f.domfrag.click('li a[data-value="arvados#pipelineInstance"]');
             s.assert.calledOn(f.cfSpy, f.ctrl);
-            s.assert.calledWith(f.cfSpy, 'fakeAttr', 'is_a', 'arvados#collection');
+            s.assert.calledWith(f.cfSpy, 'fakeAttr', 'is_a', 'arvados#pipelineInstance');
         });
     });
 });