* [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.