* [PATCH 0/1] Use Jquery's Qunit tests to create some unit tests for javascript @ 2015-08-20 19:01 brian avery 2015-08-20 19:02 ` [PATCH 1/1] toastergui: Add frontend javascript unit tests brian avery 0 siblings, 1 reply; 6+ messages in thread From: brian avery @ 2015-08-20 19:01 UTC (permalink / raw) To: bitbake-devel Use Jquery's Qunit tests to create some unit tests for javascript. The following changes since commit c348fa50186fb0796bc7b793c4b8d710419f2a0d: bitbake: toaster: move code from setup_lv_tests to setUp (2015-08-17 14:41:45 +0100) are available in the git repository at: git://git.yoctoproject.org/poky-contrib bavery/submit/michaelw/20150817_qunit-tests http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=bavery/submit/michaelw/20150817_qunit-tests Michael Wood (1): toastergui: Add frontend javascript unit tests lib/toaster/toastergui/static/js/tests/test.js | 175 +++++++++++++++++++++ .../toastergui/templates/js-unit-tests.html | 39 +++++ lib/toaster/toastergui/urls.py | 3 + lib/toaster/toastergui/views.py | 16 ++ 4 files changed, 233 insertions(+) create mode 100644 bitbake/lib/toaster/toastergui/static/js/tests/test.js create mode 100644 bitbake/lib/toaster/toastergui/templates/js-unit-tests.html -- 1.9.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/1] toastergui: Add frontend javascript unit tests 2015-08-20 19:01 [PATCH 0/1] Use Jquery's Qunit tests to create some unit tests for javascript brian avery @ 2015-08-20 19:02 ` brian avery 2015-09-08 10:30 ` Michael Wood 0 siblings, 1 reply; 6+ messages in thread From: brian avery @ 2015-08-20 19:02 UTC (permalink / raw) To: bitbake-devel From: Michael Wood <michael.g.wood@intel.com> Use Jquery's Qunit tests to create some unit tests for javascript components used in toaster. Signed-off-by: Michael Wood <michael.g.wood@intel.com> Signed-off-by: brian avery <avery.brian@gmail.com> --- lib/toaster/toastergui/static/js/tests/test.js | 175 +++++++++++++++++++++ .../toastergui/templates/js-unit-tests.html | 39 +++++ lib/toaster/toastergui/urls.py | 3 + lib/toaster/toastergui/views.py | 16 ++ 4 files changed, 233 insertions(+) create mode 100644 bitbake/lib/toaster/toastergui/static/js/tests/test.js create mode 100644 bitbake/lib/toaster/toastergui/templates/js-unit-tests.html diff --git a/lib/toaster/toastergui/static/js/tests/test.js b/lib/toaster/toastergui/static/js/tests/test.js new file mode 100644 index 0000000..d610113 --- /dev/null +++ b/lib/toaster/toastergui/static/js/tests/test.js @@ -0,0 +1,175 @@ +"use strict"; +/* Unit tests for Toaster's JS */ + +/* libtoaster tests */ + +QUnit.test("Layer alert notification", function(assert) { + var layer = { + "layerdetailurl":"/toastergui/project/1/layer/22", + "vcs_url":"git://example.com/example.git", + "detail":"[ git://example.com/example.git | master ]", + "vcs_reference":"master", + "id": 22, + "name":"meta-example" + }; + + var correctResponse = "You have added <strong>3</strong> layers to your project: <a id=\"layer-affected-name\" href=\"/toastergui/project/1/layer/22\">meta-example</a> and its dependencies <a href=\"/toastergui/project/1/layer/9\" data-original-title=\"\" title=\"\">meta-example-two</a>, <a href=\"/toastergui/project/1/layer/9\" data-original-title=\"\" title=\"\">meta-example-three</a>"; + + var layerDepsList = [ + { + "layerdetailurl":"/toastergui/project/1/layer/9", + "vcs_url":"git://example.com/example.git", + "detail":"[ git://example.com/example.git | master ]", + "vcs_reference":"master", + "id": 9, + "name":"meta-example-two" + }, + { + "layerdetailurl":"/toastergui/project/1/layer/9", + "vcs_url":"git://example.com/example.git", + "detail":"[ git://example.com/example.git | master ]", + "vcs_reference":"master", + "id": 10, + "name":"meta-example-three" + }, + ]; + + var msg = libtoaster.makeLayerAddRmAlertMsg(layer, layerDepsList, true); + var test = $("<div></div>"); + + test.html(msg); + + assert.equal(test.children("strong").text(), "3"); + assert.equal(test.children("a").length, 3); +}); + +QUnit.test("Project info", function(assert){ + var done = assert.async(); + libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl, function(prjInfo){ + assert.ok(prjInfo.machine.name); + assert.ok(prjInfo.releases.length > 0); + assert.ok(prjInfo.layers.length > 0); + assert.ok(prjInfo.freqtargets); + assert.ok(prjInfo.release); + done(); + }); +}); + +QUnit.test("Show notification", function(assert){ + var msg = "Testing"; + var element = $("#change-notification-msg"); + + libtoaster.showChangeNotification(msg); + + assert.equal(element.text(), msg); + assert.ok(element.is(":visible")); + + $("#change-notification").hide(); +}); + +var layer = { + "id": 91, + "name": "meta-crystalforest", + "layerdetailurl": "/toastergui/project/4/layer/91" +}; + +QUnit.test("Add layer", function(assert){ + var done = assert.async(); + + /* Wait for the modal to be added to the dom */ + var checkModal = setInterval(function(){ + if ($("#dependencies-modal").length > 0) { + $("#dependencies-modal .btn-primary").click(); + clearInterval(checkModal); + } + }, 200); + + libtoaster.addRmLayer(layer, true, function(deps){ + assert.equal(deps.length, 1); + done(); + }); + +}); + +QUnit.test("Rm layer", function(assert){ + var done = assert.async(); + + libtoaster.addRmLayer(layer, false, function(deps){ + assert.equal(deps.length, 0); + done(); + }); + +}); + +QUnit.test("Parse url params", function(assert){ + var params = libtoaster.parseUrlParams(); + assert.ok(params); +}); + +QUnit.test("Dump url params", function(assert){ + var params = libtoaster.dumpsUrlParams(); + assert.ok(params); +}); + +QUnit.test("Make typeaheads", function(assert){ + var layersT = $("#layers"); + var machinesT = $("#machines"); + var projectsT = $("#projects"); + var recipesT = $("#recipes"); + + libtoaster.makeTypeahead(layersT, + libtoaster.ctx.layersTypeAheadUrl, {}, function(){}); + + libtoaster.makeTypeahead(machinesT, + libtoaster.ctx.machinesTypeAheadUrl, {}, function(){}); + + libtoaster.makeTypeahead(projectsT, + libtoaster.ctx.projectsTypeAheadUrl, {}, function(){}); + + libtoaster.makeTypeahead(recipesT, + libtoaster.ctx.recipesTypeAheadUrl, {}, function(){}); + + assert.ok(recipesT.data('typeahead')); + assert.ok(layersT.data('typeahead')); + assert.ok(projectsT.data('typeahead')); + assert.ok(recipesT.data('typeahead')); +}); + + + +/* Page init functions */ + +QUnit.test("Import layer page init", function(assert){ + assert.throws(importLayerPageInit()); +}); + +QUnit.test("Project page init", function(assert){ + assert.throws(projectPageInit()); +}); + +QUnit.test("Layer details page init", function(assert){ + assert.throws(layerDetailsPageInit()); +}); + +QUnit.test("Layer btns init", function(assert){ + assert.throws(layerBtnsInit({ projectLayers : [] })); +}); + +QUnit.test("Table init", function(assert){ + assert.throws(tableInit({ url : tableUrl })); +}); + +$(document).ajaxError(function(event, jqxhr, settings, errMsg){ + if (errMsg === 'abort') + return; + + QUnit.test("Ajax error", function(assert){ + assert.notOk(jqxhr.responseText); + }); +}); + + + + + + diff --git a/lib/toaster/toastergui/templates/js-unit-tests.html b/lib/toaster/toastergui/templates/js-unit-tests.html new file mode 100644 index 0000000..5b8fd84 --- /dev/null +++ b/lib/toaster/toastergui/templates/js-unit-tests.html @@ -0,0 +1,39 @@ +{% extends "base.html" %} +{% load projecttags %} +{% load humanize %} +{% load static %} +{% block pagecontent %} + +<link rel="stylesheet" href="//code.jquery.com/qunit/qunit-1.18.0.css" /> + +<script src="//code.jquery.com/qunit/qunit-1.18.0.js"></script> + +<script src="{% static 'js/layerDepsModal.js' %}"></script> +<script src="{% static 'js/projectpage.js' %}"></script> + +<script src="{% static 'js/bootstrap.min.js' %}"></script> +<script src="{% static 'js/filtersnippet.js' %}"></script> +<script src="{% static 'js/importlayer.js' %}"></script> +<script src="{% static 'js/prettify.js' %}"></script> +<script src="{% static 'js/layerBtn.js' %}"></script> +<script src="{% static 'js/layerDepsModal.js' %}"></script> +<script src="{% static 'js/projectpage.js' %}"></script> +<script src="{% static 'js/layerdetails.js' %}"></script> +<script src="{% static 'js/table.js' %}"></script> + +<script> + var tableUrl = '{% url 'projectlayers' project.pk %}'; +</script> + +<script src="{% static 'js/tests/test.js' %}"></script> + +<div id="qunit"></div> + +<input type="text" id="layers" placeholder="layers" ></input> +<input type="text" id="recipes" placeholder="recipes"></input> +<input type="text" id="projects" placeholder="projects"></input> +<input type="text" id="machines" placeholder="machines"></input> + +{% endblock %} + + diff --git a/lib/toaster/toastergui/urls.py b/lib/toaster/toastergui/urls.py index f74090b..46e5761 100644 --- a/lib/toaster/toastergui/urls.py +++ b/lib/toaster/toastergui/urls.py @@ -145,6 +145,9 @@ urlpatterns = patterns('toastergui.views', url(r'^xhr_importlayer/$', 'xhr_importlayer', name='xhr_importlayer'), url(r'^xhr_updatelayer/$', 'xhr_updatelayer', name='xhr_updatelayer'), + # JS Unit tests + url(r'^js-unit-tests/$', 'jsunittests', name='js-unit-tests'), + # default redirection url(r'^$', RedirectView.as_view( url= 'landing')), ) diff --git a/lib/toaster/toastergui/views.py b/lib/toaster/toastergui/views.py index 889b6c6..e39baad 100755 --- a/lib/toaster/toastergui/views.py +++ b/lib/toaster/toastergui/views.py @@ -27,6 +27,7 @@ from django.shortcuts import render, redirect from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency from orm.models import Target_Installed_Package, Target_File, Target_Image_File, BuildArtifact +from orm.models import BitbakeVersion from bldcontrol import bbcontroller from django.views.decorators.cache import cache_control from django.core.urlresolvers import reverse @@ -2255,6 +2256,21 @@ if True: return context + def jsunittests(request): + """ Provides a page for the js unit tests """ + bbv = BitbakeVersion.objects.filter(branch="master").first() + release = Release.objects.filter(bitbake_version=bbv).first() + + name = "_js_unit_test_prj_" + + # If there is an existing project by this name delete it. We don't want + # Lots of duplicates cluttering up the projects. + Project.objects.filter(name=name).delete() + + new_project = Project.objects.create_project(name=name, release=release) + + context = { 'project' : new_project } + return render(request, "js-unit-tests.html", context) from django.views.decorators.csrf import csrf_exempt @csrf_exempt -- 1.9.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/1] toastergui: Add frontend javascript unit tests 2015-08-20 19:02 ` [PATCH 1/1] toastergui: Add frontend javascript unit tests brian avery @ 2015-09-08 10:30 ` Michael Wood 2015-09-08 21:09 ` Brian Avery 0 siblings, 1 reply; 6+ messages in thread From: Michael Wood @ 2015-09-08 10:30 UTC (permalink / raw) To: brian avery, bitbake-devel On 20/08/15 20:02, brian avery wrote: > From: Michael Wood <michael.g.wood@intel.com> > > Use Jquery's Qunit tests to create some unit tests for javascript > components used in toaster. > > Signed-off-by: Michael Wood <michael.g.wood@intel.com> > Signed-off-by: brian avery <avery.brian@gmail.com> > --- > lib/toaster/toastergui/static/js/tests/test.js | 175 +++++++++++++++++++++ > .../toastergui/templates/js-unit-tests.html | 39 +++++ > lib/toaster/toastergui/urls.py | 3 + > lib/toaster/toastergui/views.py | 16 ++ > 4 files changed, 233 insertions(+) > create mode 100644 bitbake/lib/toaster/toastergui/static/js/tests/test.js > create mode 100644 bitbake/lib/toaster/toastergui/templates/js-unit-tests.html > > diff --git a/lib/toaster/toastergui/static/js/tests/test.js b/lib/toaster/toastergui/static/js/tests/test.js > new file mode 100644 > index 0000000..d610113 > --- /dev/null > +++ b/lib/toaster/toastergui/static/js/tests/test.js > @@ -0,0 +1,175 @@ > +"use strict"; > +/* Unit tests for Toaster's JS */ > + > +/* libtoaster tests */ > + > +QUnit.test("Layer alert notification", function(assert) { > + var layer = { > + "layerdetailurl":"/toastergui/project/1/layer/22", > + "vcs_url":"git://example.com/example.git", > + "detail":"[ git://example.com/example.git | master ]", > + "vcs_reference":"master", > + "id": 22, > + "name":"meta-example" > + }; > + > + var correctResponse = "You have added <strong>3</strong> layers to your project: <a id=\"layer-affected-name\" href=\"/toastergui/project/1/layer/22\">meta-example</a> and its dependencies <a href=\"/toastergui/project/1/layer/9\" data-original-title=\"\" title=\"\">meta-example-two</a>, <a href=\"/toastergui/project/1/layer/9\" data-original-title=\"\" title=\"\">meta-example-three</a>"; > + > + var layerDepsList = [ > + { > + "layerdetailurl":"/toastergui/project/1/layer/9", > + "vcs_url":"git://example.com/example.git", > + "detail":"[ git://example.com/example.git | master ]", > + "vcs_reference":"master", > + "id": 9, > + "name":"meta-example-two" > + }, > + { > + "layerdetailurl":"/toastergui/project/1/layer/9", > + "vcs_url":"git://example.com/example.git", > + "detail":"[ git://example.com/example.git | master ]", > + "vcs_reference":"master", > + "id": 10, > + "name":"meta-example-three" > + }, > + ]; > + > + var msg = libtoaster.makeLayerAddRmAlertMsg(layer, layerDepsList, true); > + var test = $("<div></div>"); > + > + test.html(msg); > + > + assert.equal(test.children("strong").text(), "3"); > + assert.equal(test.children("a").length, 3); > +}); > + > +QUnit.test("Project info", function(assert){ > + var done = assert.async(); > + libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl, function(prjInfo){ > + assert.ok(prjInfo.machine.name); > + assert.ok(prjInfo.releases.length > 0); > + assert.ok(prjInfo.layers.length > 0); > + assert.ok(prjInfo.freqtargets); > + assert.ok(prjInfo.release); > + done(); > + }); > +}); > + > +QUnit.test("Show notification", function(assert){ > + var msg = "Testing"; > + var element = $("#change-notification-msg"); > + > + libtoaster.showChangeNotification(msg); > + > + assert.equal(element.text(), msg); > + assert.ok(element.is(":visible")); > + > + $("#change-notification").hide(); > +}); > + > +var layer = { > + "id": 91, > + "name": "meta-crystalforest", > + "layerdetailurl": "/toastergui/project/4/layer/91" > +}; > + > +QUnit.test("Add layer", function(assert){ > + var done = assert.async(); > + > + /* Wait for the modal to be added to the dom */ > + var checkModal = setInterval(function(){ > + if ($("#dependencies-modal").length > 0) { > + $("#dependencies-modal .btn-primary").click(); > + clearInterval(checkModal); > + } > + }, 200); > + > + libtoaster.addRmLayer(layer, true, function(deps){ > + assert.equal(deps.length, 1); > + done(); > + }); > + > +}); > + > +QUnit.test("Rm layer", function(assert){ > + var done = assert.async(); > + > + libtoaster.addRmLayer(layer, false, function(deps){ > + assert.equal(deps.length, 0); > + done(); > + }); > + > +}); > + > +QUnit.test("Parse url params", function(assert){ > + var params = libtoaster.parseUrlParams(); > + assert.ok(params); > +}); > + > +QUnit.test("Dump url params", function(assert){ > + var params = libtoaster.dumpsUrlParams(); > + assert.ok(params); > +}); > + > +QUnit.test("Make typeaheads", function(assert){ > + var layersT = $("#layers"); > + var machinesT = $("#machines"); > + var projectsT = $("#projects"); > + var recipesT = $("#recipes"); > + > + libtoaster.makeTypeahead(layersT, > + libtoaster.ctx.layersTypeAheadUrl, {}, function(){}); > + > + libtoaster.makeTypeahead(machinesT, > + libtoaster.ctx.machinesTypeAheadUrl, {}, function(){}); > + > + libtoaster.makeTypeahead(projectsT, > + libtoaster.ctx.projectsTypeAheadUrl, {}, function(){}); > + > + libtoaster.makeTypeahead(recipesT, > + libtoaster.ctx.recipesTypeAheadUrl, {}, function(){}); > + > + assert.ok(recipesT.data('typeahead')); > + assert.ok(layersT.data('typeahead')); > + assert.ok(projectsT.data('typeahead')); > + assert.ok(recipesT.data('typeahead')); > +}); > + > + > + > +/* Page init functions */ > + > +QUnit.test("Import layer page init", function(assert){ > + assert.throws(importLayerPageInit()); > +}); > + > +QUnit.test("Project page init", function(assert){ > + assert.throws(projectPageInit()); > +}); > + > +QUnit.test("Layer details page init", function(assert){ > + assert.throws(layerDetailsPageInit()); > +}); > + > +QUnit.test("Layer btns init", function(assert){ > + assert.throws(layerBtnsInit({ projectLayers : [] })); > +}); > + > +QUnit.test("Table init", function(assert){ > + assert.throws(tableInit({ url : tableUrl })); > +}); > + > +$(document).ajaxError(function(event, jqxhr, settings, errMsg){ > + if (errMsg === 'abort') > + return; > + > + QUnit.test("Ajax error", function(assert){ > + assert.notOk(jqxhr.responseText); > + }); > +}); > + > + > + > + > + > + > diff --git a/lib/toaster/toastergui/templates/js-unit-tests.html b/lib/toaster/toastergui/templates/js-unit-tests.html > new file mode 100644 > index 0000000..5b8fd84 > --- /dev/null > +++ b/lib/toaster/toastergui/templates/js-unit-tests.html > @@ -0,0 +1,39 @@ > +{% extends "base.html" %} > +{% load projecttags %} > +{% load humanize %} > +{% load static %} > +{% block pagecontent %} > + > +<link rel="stylesheet" href="//code.jquery.com/qunit/qunit-1.18.0.css" /> > + > +<script src="//code.jquery.com/qunit/qunit-1.18.0.js"></script> > + > +<script src="{% static 'js/layerDepsModal.js' %}"></script> > +<script src="{% static 'js/projectpage.js' %}"></script> > + > +<script src="{% static 'js/bootstrap.min.js' %}"></script> > +<script src="{% static 'js/filtersnippet.js' %}"></script> > +<script src="{% static 'js/importlayer.js' %}"></script> > +<script src="{% static 'js/prettify.js' %}"></script> > +<script src="{% static 'js/layerBtn.js' %}"></script> > +<script src="{% static 'js/layerDepsModal.js' %}"></script> > +<script src="{% static 'js/projectpage.js' %}"></script> > +<script src="{% static 'js/layerdetails.js' %}"></script> > +<script src="{% static 'js/table.js' %}"></script> > + > +<script> > + var tableUrl = '{% url 'projectlayers' project.pk %}'; > +</script> > + > +<script src="{% static 'js/tests/test.js' %}"></script> > + > +<div id="qunit"></div> > + > +<input type="text" id="layers" placeholder="layers" ></input> > +<input type="text" id="recipes" placeholder="recipes"></input> > +<input type="text" id="projects" placeholder="projects"></input> > +<input type="text" id="machines" placeholder="machines"></input> > + > +{% endblock %} > + > + > diff --git a/lib/toaster/toastergui/urls.py b/lib/toaster/toastergui/urls.py > index f74090b..46e5761 100644 > --- a/lib/toaster/toastergui/urls.py > +++ b/lib/toaster/toastergui/urls.py > @@ -145,6 +145,9 @@ urlpatterns = patterns('toastergui.views', > url(r'^xhr_importlayer/$', 'xhr_importlayer', name='xhr_importlayer'), > url(r'^xhr_updatelayer/$', 'xhr_updatelayer', name='xhr_updatelayer'), > > + # JS Unit tests > + url(r'^js-unit-tests/$', 'jsunittests', name='js-unit-tests'), > + > # default redirection > url(r'^$', RedirectView.as_view( url= 'landing')), > ) > diff --git a/lib/toaster/toastergui/views.py b/lib/toaster/toastergui/views.py > index 889b6c6..e39baad 100755 > --- a/lib/toaster/toastergui/views.py > +++ b/lib/toaster/toastergui/views.py > @@ -27,6 +27,7 @@ from django.shortcuts import render, redirect > from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable > from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency > from orm.models import Target_Installed_Package, Target_File, Target_Image_File, BuildArtifact > +from orm.models import BitbakeVersion > from bldcontrol import bbcontroller > from django.views.decorators.cache import cache_control > from django.core.urlresolvers import reverse > @@ -2255,6 +2256,21 @@ if True: > > return context > > + def jsunittests(request): > + """ Provides a page for the js unit tests """ > + bbv = BitbakeVersion.objects.filter(branch="master").first() > + release = Release.objects.filter(bitbake_version=bbv).first() > + > + name = "_js_unit_test_prj_" > + > + # If there is an existing project by this name delete it. We don't want > + # Lots of duplicates cluttering up the projects. > + Project.objects.filter(name=name).delete() > + > + new_project = Project.objects.create_project(name=name, release=release) > + > + context = { 'project' : new_project } > + return render(request, "js-unit-tests.html", context) > > from django.views.decorators.csrf import csrf_exempt > @csrf_exempt This patch seems to have landed without the new files http://cgit.openembedded.org/bitbake/commit/?id=1c2f6b9b7b9e700146944b9d6d2114e0d014ee81 -rw-r--r-- lib/toaster/toastergui/urls.py 3 -rwxr-xr-x lib/toaster/toastergui/views.py 16 2 files changed, 19 insertions, 0 deletions ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/1] toastergui: Add frontend javascript unit tests 2015-09-08 10:30 ` Michael Wood @ 2015-09-08 21:09 ` Brian Avery 2015-09-09 22:04 ` Brian Avery 0 siblings, 1 reply; 6+ messages in thread From: Brian Avery @ 2015-09-08 21:09 UTC (permalink / raw) To: Michael Wood; +Cc: bitbake-devel yes, the following files were new in the patch and were not created: lib/toaster/toastergui/static/js/tests/test.js b/lib/toaster/toastergui/static/js/tests/test.js lib/toaster/toastergui/templates/js-unit-tests.html b/lib/toaster/toastergui/templates/js-unit-tests.html -bavery On Tue, Sep 8, 2015 at 3:30 AM, Michael Wood <michael.g.wood@intel.com> wrote: > On 20/08/15 20:02, brian avery wrote: >> >> From: Michael Wood <michael.g.wood@intel.com> >> >> Use Jquery's Qunit tests to create some unit tests for javascript >> components used in toaster. >> >> Signed-off-by: Michael Wood <michael.g.wood@intel.com> >> Signed-off-by: brian avery <avery.brian@gmail.com> >> --- >> lib/toaster/toastergui/static/js/tests/test.js | 175 >> +++++++++++++++++++++ >> .../toastergui/templates/js-unit-tests.html | 39 +++++ >> lib/toaster/toastergui/urls.py | 3 + >> lib/toaster/toastergui/views.py | 16 ++ >> 4 files changed, 233 insertions(+) >> create mode 100644 >> bitbake/lib/toaster/toastergui/static/js/tests/test.js >> create mode 100644 >> bitbake/lib/toaster/toastergui/templates/js-unit-tests.html >> >> diff --git a/lib/toaster/toastergui/static/js/tests/test.js >> b/lib/toaster/toastergui/static/js/tests/test.js >> new file mode 100644 >> index 0000000..d610113 >> --- /dev/null >> +++ b/lib/toaster/toastergui/static/js/tests/test.js >> @@ -0,0 +1,175 @@ >> +"use strict"; >> +/* Unit tests for Toaster's JS */ >> + >> +/* libtoaster tests */ >> + >> +QUnit.test("Layer alert notification", function(assert) { >> + var layer = { >> + "layerdetailurl":"/toastergui/project/1/layer/22", >> + "vcs_url":"git://example.com/example.git", >> + "detail":"[ git://example.com/example.git | master ]", >> + "vcs_reference":"master", >> + "id": 22, >> + "name":"meta-example" >> + }; >> + >> + var correctResponse = "You have added <strong>3</strong> layers to your >> project: <a id=\"layer-affected-name\" >> href=\"/toastergui/project/1/layer/22\">meta-example</a> and its >> dependencies <a href=\"/toastergui/project/1/layer/9\" >> data-original-title=\"\" title=\"\">meta-example-two</a>, <a >> href=\"/toastergui/project/1/layer/9\" data-original-title=\"\" >> title=\"\">meta-example-three</a>"; >> + >> + var layerDepsList = [ >> + { >> + "layerdetailurl":"/toastergui/project/1/layer/9", >> + "vcs_url":"git://example.com/example.git", >> + "detail":"[ git://example.com/example.git | master ]", >> + "vcs_reference":"master", >> + "id": 9, >> + "name":"meta-example-two" >> + }, >> + { >> + "layerdetailurl":"/toastergui/project/1/layer/9", >> + "vcs_url":"git://example.com/example.git", >> + "detail":"[ git://example.com/example.git | master ]", >> + "vcs_reference":"master", >> + "id": 10, >> + "name":"meta-example-three" >> + }, >> + ]; >> + >> + var msg = libtoaster.makeLayerAddRmAlertMsg(layer, layerDepsList, >> true); >> + var test = $("<div></div>"); >> + >> + test.html(msg); >> + >> + assert.equal(test.children("strong").text(), "3"); >> + assert.equal(test.children("a").length, 3); >> +}); >> + >> +QUnit.test("Project info", function(assert){ >> + var done = assert.async(); >> + libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl, >> function(prjInfo){ >> + assert.ok(prjInfo.machine.name); >> + assert.ok(prjInfo.releases.length > 0); >> + assert.ok(prjInfo.layers.length > 0); >> + assert.ok(prjInfo.freqtargets); >> + assert.ok(prjInfo.release); >> + done(); >> + }); >> +}); >> + >> +QUnit.test("Show notification", function(assert){ >> + var msg = "Testing"; >> + var element = $("#change-notification-msg"); >> + >> + libtoaster.showChangeNotification(msg); >> + >> + assert.equal(element.text(), msg); >> + assert.ok(element.is(":visible")); >> + >> + $("#change-notification").hide(); >> +}); >> + >> +var layer = { >> + "id": 91, >> + "name": "meta-crystalforest", >> + "layerdetailurl": "/toastergui/project/4/layer/91" >> +}; >> + >> +QUnit.test("Add layer", function(assert){ >> + var done = assert.async(); >> + >> + /* Wait for the modal to be added to the dom */ >> + var checkModal = setInterval(function(){ >> + if ($("#dependencies-modal").length > 0) { >> + $("#dependencies-modal .btn-primary").click(); >> + clearInterval(checkModal); >> + } >> + }, 200); >> + >> + libtoaster.addRmLayer(layer, true, function(deps){ >> + assert.equal(deps.length, 1); >> + done(); >> + }); >> + >> +}); >> + >> +QUnit.test("Rm layer", function(assert){ >> + var done = assert.async(); >> + >> + libtoaster.addRmLayer(layer, false, function(deps){ >> + assert.equal(deps.length, 0); >> + done(); >> + }); >> + >> +}); >> + >> +QUnit.test("Parse url params", function(assert){ >> + var params = libtoaster.parseUrlParams(); >> + assert.ok(params); >> +}); >> + >> +QUnit.test("Dump url params", function(assert){ >> + var params = libtoaster.dumpsUrlParams(); >> + assert.ok(params); >> +}); >> + >> +QUnit.test("Make typeaheads", function(assert){ >> + var layersT = $("#layers"); >> + var machinesT = $("#machines"); >> + var projectsT = $("#projects"); >> + var recipesT = $("#recipes"); >> + >> + libtoaster.makeTypeahead(layersT, >> + libtoaster.ctx.layersTypeAheadUrl, {}, function(){}); >> + >> + libtoaster.makeTypeahead(machinesT, >> + libtoaster.ctx.machinesTypeAheadUrl, {}, function(){}); >> + >> + libtoaster.makeTypeahead(projectsT, >> + libtoaster.ctx.projectsTypeAheadUrl, {}, function(){}); >> + >> + libtoaster.makeTypeahead(recipesT, >> + libtoaster.ctx.recipesTypeAheadUrl, {}, function(){}); >> + >> + assert.ok(recipesT.data('typeahead')); >> + assert.ok(layersT.data('typeahead')); >> + assert.ok(projectsT.data('typeahead')); >> + assert.ok(recipesT.data('typeahead')); >> +}); >> + >> + >> + >> +/* Page init functions */ >> + >> +QUnit.test("Import layer page init", function(assert){ >> + assert.throws(importLayerPageInit()); >> +}); >> + >> +QUnit.test("Project page init", function(assert){ >> + assert.throws(projectPageInit()); >> +}); >> + >> +QUnit.test("Layer details page init", function(assert){ >> + assert.throws(layerDetailsPageInit()); >> +}); >> + >> +QUnit.test("Layer btns init", function(assert){ >> + assert.throws(layerBtnsInit({ projectLayers : [] })); >> +}); >> + >> +QUnit.test("Table init", function(assert){ >> + assert.throws(tableInit({ url : tableUrl })); >> +}); >> + >> +$(document).ajaxError(function(event, jqxhr, settings, errMsg){ >> + if (errMsg === 'abort') >> + return; >> + >> + QUnit.test("Ajax error", function(assert){ >> + assert.notOk(jqxhr.responseText); >> + }); >> +}); >> + >> + >> + >> + >> + >> + >> diff --git a/lib/toaster/toastergui/templates/js-unit-tests.html >> b/lib/toaster/toastergui/templates/js-unit-tests.html >> new file mode 100644 >> index 0000000..5b8fd84 >> --- /dev/null >> +++ b/lib/toaster/toastergui/templates/js-unit-tests.html >> @@ -0,0 +1,39 @@ >> +{% extends "base.html" %} >> +{% load projecttags %} >> +{% load humanize %} >> +{% load static %} >> +{% block pagecontent %} >> + >> +<link rel="stylesheet" href="//code.jquery.com/qunit/qunit-1.18.0.css" /> >> + >> +<script src="//code.jquery.com/qunit/qunit-1.18.0.js"></script> >> + >> +<script src="{% static 'js/layerDepsModal.js' %}"></script> >> +<script src="{% static 'js/projectpage.js' %}"></script> >> + >> +<script src="{% static 'js/bootstrap.min.js' %}"></script> >> +<script src="{% static 'js/filtersnippet.js' %}"></script> >> +<script src="{% static 'js/importlayer.js' %}"></script> >> +<script src="{% static 'js/prettify.js' %}"></script> >> +<script src="{% static 'js/layerBtn.js' %}"></script> >> +<script src="{% static 'js/layerDepsModal.js' %}"></script> >> +<script src="{% static 'js/projectpage.js' %}"></script> >> +<script src="{% static 'js/layerdetails.js' %}"></script> >> +<script src="{% static 'js/table.js' %}"></script> >> + >> +<script> >> + var tableUrl = '{% url 'projectlayers' project.pk %}'; >> +</script> >> + >> +<script src="{% static 'js/tests/test.js' %}"></script> >> + >> +<div id="qunit"></div> >> + >> +<input type="text" id="layers" placeholder="layers" ></input> >> +<input type="text" id="recipes" placeholder="recipes"></input> >> +<input type="text" id="projects" placeholder="projects"></input> >> +<input type="text" id="machines" placeholder="machines"></input> >> + >> +{% endblock %} >> + >> + >> diff --git a/lib/toaster/toastergui/urls.py >> b/lib/toaster/toastergui/urls.py >> index f74090b..46e5761 100644 >> --- a/lib/toaster/toastergui/urls.py >> +++ b/lib/toaster/toastergui/urls.py >> @@ -145,6 +145,9 @@ urlpatterns = patterns('toastergui.views', >> url(r'^xhr_importlayer/$', 'xhr_importlayer', >> name='xhr_importlayer'), >> url(r'^xhr_updatelayer/$', 'xhr_updatelayer', >> name='xhr_updatelayer'), >> + # JS Unit tests >> + url(r'^js-unit-tests/$', 'jsunittests', name='js-unit-tests'), >> + >> # default redirection >> url(r'^$', RedirectView.as_view( url= 'landing')), >> ) >> diff --git a/lib/toaster/toastergui/views.py >> b/lib/toaster/toastergui/views.py >> index 889b6c6..e39baad 100755 >> --- a/lib/toaster/toastergui/views.py >> +++ b/lib/toaster/toastergui/views.py >> @@ -27,6 +27,7 @@ from django.shortcuts import render, redirect >> from orm.models import Build, Target, Task, Layer, Layer_Version, >> Recipe, LogMessage, Variable >> from orm.models import Task_Dependency, Recipe_Dependency, Package, >> Package_File, Package_Dependency >> from orm.models import Target_Installed_Package, Target_File, >> Target_Image_File, BuildArtifact >> +from orm.models import BitbakeVersion >> from bldcontrol import bbcontroller >> from django.views.decorators.cache import cache_control >> from django.core.urlresolvers import reverse >> @@ -2255,6 +2256,21 @@ if True: >> return context >> + def jsunittests(request): >> + """ Provides a page for the js unit tests """ >> + bbv = BitbakeVersion.objects.filter(branch="master").first() >> + release = Release.objects.filter(bitbake_version=bbv).first() >> + >> + name = "_js_unit_test_prj_" >> + >> + # If there is an existing project by this name delete it. We don't >> want >> + # Lots of duplicates cluttering up the projects. >> + Project.objects.filter(name=name).delete() >> + >> + new_project = Project.objects.create_project(name=name, >> release=release) >> + >> + context = { 'project' : new_project } >> + return render(request, "js-unit-tests.html", context) >> from django.views.decorators.csrf import csrf_exempt >> @csrf_exempt > > > This patch seems to have landed without the new files > http://cgit.openembedded.org/bitbake/commit/?id=1c2f6b9b7b9e700146944b9d6d2114e0d014ee81 > > -rw-r--r-- lib/toaster/toastergui/urls.py 3 > -rwxr-xr-x lib/toaster/toastergui/views.py 16 > 2 files changed, 19 insertions, 0 deletions > > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/1] toastergui: Add frontend javascript unit tests 2015-09-08 21:09 ` Brian Avery @ 2015-09-09 22:04 ` Brian Avery 2015-09-10 8:57 ` Richard Purdie 0 siblings, 1 reply; 6+ messages in thread From: Brian Avery @ 2015-09-09 22:04 UTC (permalink / raw) To: Michael Wood; +Cc: bitbake-devel should I resubmit this to get the js and html file merged? -b On Tue, Sep 8, 2015 at 2:09 PM, Brian Avery <avery.brian@gmail.com> wrote: > yes, the following files were new in the patch and were not created: > lib/toaster/toastergui/static/js/tests/test.js > b/lib/toaster/toastergui/static/js/tests/test.js > lib/toaster/toastergui/templates/js-unit-tests.html > b/lib/toaster/toastergui/templates/js-unit-tests.html > > -bavery > > On Tue, Sep 8, 2015 at 3:30 AM, Michael Wood <michael.g.wood@intel.com> wrote: >> On 20/08/15 20:02, brian avery wrote: >>> >>> From: Michael Wood <michael.g.wood@intel.com> >>> >>> Use Jquery's Qunit tests to create some unit tests for javascript >>> components used in toaster. >>> >>> Signed-off-by: Michael Wood <michael.g.wood@intel.com> >>> Signed-off-by: brian avery <avery.brian@gmail.com> >>> --- >>> lib/toaster/toastergui/static/js/tests/test.js | 175 >>> +++++++++++++++++++++ >>> .../toastergui/templates/js-unit-tests.html | 39 +++++ >>> lib/toaster/toastergui/urls.py | 3 + >>> lib/toaster/toastergui/views.py | 16 ++ >>> 4 files changed, 233 insertions(+) >>> create mode 100644 >>> bitbake/lib/toaster/toastergui/static/js/tests/test.js >>> create mode 100644 >>> bitbake/lib/toaster/toastergui/templates/js-unit-tests.html >>> >>> diff --git a/lib/toaster/toastergui/static/js/tests/test.js >>> b/lib/toaster/toastergui/static/js/tests/test.js >>> new file mode 100644 >>> index 0000000..d610113 >>> --- /dev/null >>> +++ b/lib/toaster/toastergui/static/js/tests/test.js >>> @@ -0,0 +1,175 @@ >>> +"use strict"; >>> +/* Unit tests for Toaster's JS */ >>> + >>> +/* libtoaster tests */ >>> + >>> +QUnit.test("Layer alert notification", function(assert) { >>> + var layer = { >>> + "layerdetailurl":"/toastergui/project/1/layer/22", >>> + "vcs_url":"git://example.com/example.git", >>> + "detail":"[ git://example.com/example.git | master ]", >>> + "vcs_reference":"master", >>> + "id": 22, >>> + "name":"meta-example" >>> + }; >>> + >>> + var correctResponse = "You have added <strong>3</strong> layers to your >>> project: <a id=\"layer-affected-name\" >>> href=\"/toastergui/project/1/layer/22\">meta-example</a> and its >>> dependencies <a href=\"/toastergui/project/1/layer/9\" >>> data-original-title=\"\" title=\"\">meta-example-two</a>, <a >>> href=\"/toastergui/project/1/layer/9\" data-original-title=\"\" >>> title=\"\">meta-example-three</a>"; >>> + >>> + var layerDepsList = [ >>> + { >>> + "layerdetailurl":"/toastergui/project/1/layer/9", >>> + "vcs_url":"git://example.com/example.git", >>> + "detail":"[ git://example.com/example.git | master ]", >>> + "vcs_reference":"master", >>> + "id": 9, >>> + "name":"meta-example-two" >>> + }, >>> + { >>> + "layerdetailurl":"/toastergui/project/1/layer/9", >>> + "vcs_url":"git://example.com/example.git", >>> + "detail":"[ git://example.com/example.git | master ]", >>> + "vcs_reference":"master", >>> + "id": 10, >>> + "name":"meta-example-three" >>> + }, >>> + ]; >>> + >>> + var msg = libtoaster.makeLayerAddRmAlertMsg(layer, layerDepsList, >>> true); >>> + var test = $("<div></div>"); >>> + >>> + test.html(msg); >>> + >>> + assert.equal(test.children("strong").text(), "3"); >>> + assert.equal(test.children("a").length, 3); >>> +}); >>> + >>> +QUnit.test("Project info", function(assert){ >>> + var done = assert.async(); >>> + libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl, >>> function(prjInfo){ >>> + assert.ok(prjInfo.machine.name); >>> + assert.ok(prjInfo.releases.length > 0); >>> + assert.ok(prjInfo.layers.length > 0); >>> + assert.ok(prjInfo.freqtargets); >>> + assert.ok(prjInfo.release); >>> + done(); >>> + }); >>> +}); >>> + >>> +QUnit.test("Show notification", function(assert){ >>> + var msg = "Testing"; >>> + var element = $("#change-notification-msg"); >>> + >>> + libtoaster.showChangeNotification(msg); >>> + >>> + assert.equal(element.text(), msg); >>> + assert.ok(element.is(":visible")); >>> + >>> + $("#change-notification").hide(); >>> +}); >>> + >>> +var layer = { >>> + "id": 91, >>> + "name": "meta-crystalforest", >>> + "layerdetailurl": "/toastergui/project/4/layer/91" >>> +}; >>> + >>> +QUnit.test("Add layer", function(assert){ >>> + var done = assert.async(); >>> + >>> + /* Wait for the modal to be added to the dom */ >>> + var checkModal = setInterval(function(){ >>> + if ($("#dependencies-modal").length > 0) { >>> + $("#dependencies-modal .btn-primary").click(); >>> + clearInterval(checkModal); >>> + } >>> + }, 200); >>> + >>> + libtoaster.addRmLayer(layer, true, function(deps){ >>> + assert.equal(deps.length, 1); >>> + done(); >>> + }); >>> + >>> +}); >>> + >>> +QUnit.test("Rm layer", function(assert){ >>> + var done = assert.async(); >>> + >>> + libtoaster.addRmLayer(layer, false, function(deps){ >>> + assert.equal(deps.length, 0); >>> + done(); >>> + }); >>> + >>> +}); >>> + >>> +QUnit.test("Parse url params", function(assert){ >>> + var params = libtoaster.parseUrlParams(); >>> + assert.ok(params); >>> +}); >>> + >>> +QUnit.test("Dump url params", function(assert){ >>> + var params = libtoaster.dumpsUrlParams(); >>> + assert.ok(params); >>> +}); >>> + >>> +QUnit.test("Make typeaheads", function(assert){ >>> + var layersT = $("#layers"); >>> + var machinesT = $("#machines"); >>> + var projectsT = $("#projects"); >>> + var recipesT = $("#recipes"); >>> + >>> + libtoaster.makeTypeahead(layersT, >>> + libtoaster.ctx.layersTypeAheadUrl, {}, function(){}); >>> + >>> + libtoaster.makeTypeahead(machinesT, >>> + libtoaster.ctx.machinesTypeAheadUrl, {}, function(){}); >>> + >>> + libtoaster.makeTypeahead(projectsT, >>> + libtoaster.ctx.projectsTypeAheadUrl, {}, function(){}); >>> + >>> + libtoaster.makeTypeahead(recipesT, >>> + libtoaster.ctx.recipesTypeAheadUrl, {}, function(){}); >>> + >>> + assert.ok(recipesT.data('typeahead')); >>> + assert.ok(layersT.data('typeahead')); >>> + assert.ok(projectsT.data('typeahead')); >>> + assert.ok(recipesT.data('typeahead')); >>> +}); >>> + >>> + >>> + >>> +/* Page init functions */ >>> + >>> +QUnit.test("Import layer page init", function(assert){ >>> + assert.throws(importLayerPageInit()); >>> +}); >>> + >>> +QUnit.test("Project page init", function(assert){ >>> + assert.throws(projectPageInit()); >>> +}); >>> + >>> +QUnit.test("Layer details page init", function(assert){ >>> + assert.throws(layerDetailsPageInit()); >>> +}); >>> + >>> +QUnit.test("Layer btns init", function(assert){ >>> + assert.throws(layerBtnsInit({ projectLayers : [] })); >>> +}); >>> + >>> +QUnit.test("Table init", function(assert){ >>> + assert.throws(tableInit({ url : tableUrl })); >>> +}); >>> + >>> +$(document).ajaxError(function(event, jqxhr, settings, errMsg){ >>> + if (errMsg === 'abort') >>> + return; >>> + >>> + QUnit.test("Ajax error", function(assert){ >>> + assert.notOk(jqxhr.responseText); >>> + }); >>> +}); >>> + >>> + >>> + >>> + >>> + >>> + >>> diff --git a/lib/toaster/toastergui/templates/js-unit-tests.html >>> b/lib/toaster/toastergui/templates/js-unit-tests.html >>> new file mode 100644 >>> index 0000000..5b8fd84 >>> --- /dev/null >>> +++ b/lib/toaster/toastergui/templates/js-unit-tests.html >>> @@ -0,0 +1,39 @@ >>> +{% extends "base.html" %} >>> +{% load projecttags %} >>> +{% load humanize %} >>> +{% load static %} >>> +{% block pagecontent %} >>> + >>> +<link rel="stylesheet" href="//code.jquery.com/qunit/qunit-1.18.0.css" /> >>> + >>> +<script src="//code.jquery.com/qunit/qunit-1.18.0.js"></script> >>> + >>> +<script src="{% static 'js/layerDepsModal.js' %}"></script> >>> +<script src="{% static 'js/projectpage.js' %}"></script> >>> + >>> +<script src="{% static 'js/bootstrap.min.js' %}"></script> >>> +<script src="{% static 'js/filtersnippet.js' %}"></script> >>> +<script src="{% static 'js/importlayer.js' %}"></script> >>> +<script src="{% static 'js/prettify.js' %}"></script> >>> +<script src="{% static 'js/layerBtn.js' %}"></script> >>> +<script src="{% static 'js/layerDepsModal.js' %}"></script> >>> +<script src="{% static 'js/projectpage.js' %}"></script> >>> +<script src="{% static 'js/layerdetails.js' %}"></script> >>> +<script src="{% static 'js/table.js' %}"></script> >>> + >>> +<script> >>> + var tableUrl = '{% url 'projectlayers' project.pk %}'; >>> +</script> >>> + >>> +<script src="{% static 'js/tests/test.js' %}"></script> >>> + >>> +<div id="qunit"></div> >>> + >>> +<input type="text" id="layers" placeholder="layers" ></input> >>> +<input type="text" id="recipes" placeholder="recipes"></input> >>> +<input type="text" id="projects" placeholder="projects"></input> >>> +<input type="text" id="machines" placeholder="machines"></input> >>> + >>> +{% endblock %} >>> + >>> + >>> diff --git a/lib/toaster/toastergui/urls.py >>> b/lib/toaster/toastergui/urls.py >>> index f74090b..46e5761 100644 >>> --- a/lib/toaster/toastergui/urls.py >>> +++ b/lib/toaster/toastergui/urls.py >>> @@ -145,6 +145,9 @@ urlpatterns = patterns('toastergui.views', >>> url(r'^xhr_importlayer/$', 'xhr_importlayer', >>> name='xhr_importlayer'), >>> url(r'^xhr_updatelayer/$', 'xhr_updatelayer', >>> name='xhr_updatelayer'), >>> + # JS Unit tests >>> + url(r'^js-unit-tests/$', 'jsunittests', name='js-unit-tests'), >>> + >>> # default redirection >>> url(r'^$', RedirectView.as_view( url= 'landing')), >>> ) >>> diff --git a/lib/toaster/toastergui/views.py >>> b/lib/toaster/toastergui/views.py >>> index 889b6c6..e39baad 100755 >>> --- a/lib/toaster/toastergui/views.py >>> +++ b/lib/toaster/toastergui/views.py >>> @@ -27,6 +27,7 @@ from django.shortcuts import render, redirect >>> from orm.models import Build, Target, Task, Layer, Layer_Version, >>> Recipe, LogMessage, Variable >>> from orm.models import Task_Dependency, Recipe_Dependency, Package, >>> Package_File, Package_Dependency >>> from orm.models import Target_Installed_Package, Target_File, >>> Target_Image_File, BuildArtifact >>> +from orm.models import BitbakeVersion >>> from bldcontrol import bbcontroller >>> from django.views.decorators.cache import cache_control >>> from django.core.urlresolvers import reverse >>> @@ -2255,6 +2256,21 @@ if True: >>> return context >>> + def jsunittests(request): >>> + """ Provides a page for the js unit tests """ >>> + bbv = BitbakeVersion.objects.filter(branch="master").first() >>> + release = Release.objects.filter(bitbake_version=bbv).first() >>> + >>> + name = "_js_unit_test_prj_" >>> + >>> + # If there is an existing project by this name delete it. We don't >>> want >>> + # Lots of duplicates cluttering up the projects. >>> + Project.objects.filter(name=name).delete() >>> + >>> + new_project = Project.objects.create_project(name=name, >>> release=release) >>> + >>> + context = { 'project' : new_project } >>> + return render(request, "js-unit-tests.html", context) >>> from django.views.decorators.csrf import csrf_exempt >>> @csrf_exempt >> >> >> This patch seems to have landed without the new files >> http://cgit.openembedded.org/bitbake/commit/?id=1c2f6b9b7b9e700146944b9d6d2114e0d014ee81 >> >> -rw-r--r-- lib/toaster/toastergui/urls.py 3 >> -rwxr-xr-x lib/toaster/toastergui/views.py 16 >> 2 files changed, 19 insertions, 0 deletions >> >> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/1] toastergui: Add frontend javascript unit tests 2015-09-09 22:04 ` Brian Avery @ 2015-09-10 8:57 ` Richard Purdie 0 siblings, 0 replies; 6+ messages in thread From: Richard Purdie @ 2015-09-10 8:57 UTC (permalink / raw) To: Brian Avery; +Cc: bitbake-devel On Wed, 2015-09-09 at 15:04 -0700, Brian Avery wrote: > should I resubmit this to get the js and html file merged? > -b > > On Tue, Sep 8, 2015 at 2:09 PM, Brian Avery <avery.brian@gmail.com> wrote: > > yes, the following files were new in the patch and were not created: > > lib/toaster/toastergui/static/js/tests/test.js > > b/lib/toaster/toastergui/static/js/tests/test.js > > lib/toaster/toastergui/templates/js-unit-tests.html > > b/lib/toaster/toastergui/templates/js-unit-tests.html > > I believe this was fixed yesterday. Let me know if not. Cheers, Richard ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-09-10 8:57 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-08-20 19:01 [PATCH 0/1] Use Jquery's Qunit tests to create some unit tests for javascript brian avery 2015-08-20 19:02 ` [PATCH 1/1] toastergui: Add frontend javascript unit tests brian avery 2015-09-08 10:30 ` Michael Wood 2015-09-08 21:09 ` Brian Avery 2015-09-09 22:04 ` Brian Avery 2015-09-10 8:57 ` Richard Purdie
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.