You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2024/07/09 10:59:00 UTC
(jena) 02/02: GH-1611: add unit test
This is an automated email from the ASF dual-hosted git repository.
andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git
commit 94fc67a0cb2bd916b72ac2635f3a13a77f3beef4
Author: Bruno P. Kinoshita <ki...@users.noreply.github.com>
AuthorDate: Sun Jun 9 15:58:37 2024 +0200
GH-1611: add unit test
---
.../jena-fuseki-ui/src/views/dataset/Query.vue | 2 +-
.../tests/unit/views/dataset/query.vue.spec.js | 134 +++++++++++++++++++++
2 files changed, 135 insertions(+), 1 deletion(-)
diff --git a/jena-fuseki2/jena-fuseki-ui/src/views/dataset/Query.vue b/jena-fuseki2/jena-fuseki-ui/src/views/dataset/Query.vue
index 0b54a6826a..2d424f5407 100644
--- a/jena-fuseki2/jena-fuseki-ui/src/views/dataset/Query.vue
+++ b/jena-fuseki2/jena-fuseki-ui/src/views/dataset/Query.vue
@@ -296,7 +296,7 @@ export default {
showQueryButton: true,
resizeable: true,
requestConfig: {
- acceptHeaderGraph : this.contentTypeGraph,
+ acceptHeaderGraph: this.contentTypeGraph,
endpoint: this.$fusekiService.getFusekiUrl(this.currentDatasetUrl)
},
createShareableLink: curriedCreateShareableLink
diff --git a/jena-fuseki2/jena-fuseki-ui/tests/unit/views/dataset/query.vue.spec.js b/jena-fuseki2/jena-fuseki-ui/tests/unit/views/dataset/query.vue.spec.js
new file mode 100644
index 0000000000..32ead25c20
--- /dev/null
+++ b/jena-fuseki2/jena-fuseki-ui/tests/unit/views/dataset/query.vue.spec.js
@@ -0,0 +1,134 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { flushPromises, mount } from '@vue/test-utils'
+import { nextTick } from 'vue'
+import Query from '@/views/dataset/Query.vue'
+import { vi } from 'vitest'
+
+const FAKE_FUSEKI_URL = 'https://localhost:1234/fuseki/'
+
+const $routeMock = {
+ query: {}
+}
+
+const mountFunction = options => {
+ const mountOptions = Object.assign(options || {}, {
+ shallow: true,
+ global: {
+ mocks: {
+ $route: $routeMock,
+ $fusekiService: {
+ getFusekiUrl () {
+ return FAKE_FUSEKI_URL
+ }
+ }
+ }
+ }
+ })
+ return mount(Query, {
+ ...mountOptions
+ })
+}
+
+describe('Query view', () => {
+ let yasrDiv
+ let yasqeDiv
+ beforeEach(() => {
+ // DOM elements required by YASQE/YASR.
+ yasrDiv = document.createElement('div')
+ yasrDiv.setAttribute('id', 'yasr')
+ yasqeDiv = document.createElement('div')
+ yasqeDiv.setAttribute('id', 'yasqe')
+ document.body.append(yasrDiv)
+ document.body.append(yasqeDiv)
+ // we will have to mock setTimeout and nextTick at least, for the component with DOM
+ vi.useFakeTimers({
+ toFake: [
+ 'Date',
+ 'nextTick',
+ 'setTimeout'
+ ],
+ shouldAdvanceTime: true
+ })
+ // jsdom doesn't have getBoundingClientRect
+ document.createRange = () => {
+ const range = new Range();
+
+ range.getBoundingClientRect = () => {
+ return {
+ x: 0,
+ y: 0,
+ bottom: 0,
+ height: 0,
+ left: 0,
+ right: 0,
+ top: 0,
+ width: 0,
+ toJSON: () => {}
+ };
+ };
+
+ range.getClientRects = () => {
+ return {
+ // eslint-disable-next-line no-unused-vars
+ item: (index) => null,
+ length: 0,
+ *[Symbol.iterator](){}
+ };
+ };
+
+ return range;
+ }
+ })
+ afterEach(() => {
+ vi.restoreAllMocks()
+ vi.useRealTimers()
+ })
+ it('is created with the correct initial values', async () => {
+ expect(vi.isFakeTimers()).equals(true)
+ const datasetName = 'test'
+ const wrapper = mountFunction({
+ props: {
+ datasetName: datasetName
+ }
+ })
+
+ // Test the prop value.
+ expect(wrapper.vm.$props.datasetName).equals(datasetName)
+
+ // The component needs to interface with DOM due to YASQE, and it contains
+ // a `nextTick`, that calls `setTimeout` (this is what worked in the end,
+ // although probably a `Teleport` could replace it...). So we need to mock
+ // that here. The timeout is of `300ms`, so we move the clock by `400ms`.
+ await nextTick()
+ await vi.advanceTimersByTime(400)
+ await flushPromises()
+
+ // Now YASQE and YASR must have been initialized.
+ expect(wrapper.vm.yasqe).not.equals(null)
+
+ // Test the initial values.
+ const yasqeOptions = wrapper.vm.yasqe.options
+ expect(yasqeOptions.showQueryButton).true
+ expect(yasqeOptions.resizeable).true
+
+ const requestConfig = yasqeOptions.requestConfig
+ expect(await requestConfig.endpoint).equals(FAKE_FUSEKI_URL)
+ // See issue https://github.com/apache/jena/issues/1611
+ expect(requestConfig.acceptHeaderGraph).equals(wrapper.vm.$data.contentTypeGraph)
+ })
+})