UNPKG

clownface

Version:

Simple but powerful graph traversing library

191 lines (145 loc) 7.13 kB
import assert from 'assert' import { describe, it } from 'mocha' import sinon from 'sinon' import { addAll } from 'rdf-dataset-ext' import Environment from '@rdfjs/environment' import NamespaceFactory from '@rdfjs/namespace/Factory.js' import clownface from '../../index.js' import rdf from '../support/factory.js' import CustomDataFactory from '../support/CustomDataFactory.js' describe('.addIn', () => { it('should be a function', () => { const cf = clownface({ dataset: rdf.dataset() }) assert.strictEqual(typeof cf.addIn, 'function') }) it('should throw an error if predicate parameter is missing', () => { const subject = rdf.namedNode('http://localhost:8080/data/person/bernadette-rostenkowski') const object = rdf.namedNode('http://localhost:8080/data/person/mary-cooper') const cf = clownface({ dataset: rdf.dataset(), term: object }) let touched = false try { cf.addIn(null, subject) } catch (err) { touched = true } assert(touched) }) it('should add quads using the context term as object and the given predicate and subject', () => { const dataset = rdf.dataset() const subject = rdf.namedNode('http://localhost:8080/data/person/bernadette-rostenkowski') const predicate = rdf.namedNode('http://schema.org/knows') const object = rdf.namedNode('http://localhost:8080/data/person/mary-cooper') const cf = clownface({ dataset, term: object }) cf.addIn(predicate, subject) const result = dataset.match(subject, predicate, object) assert.strictEqual(result.size, 1) }) it('should create a Blank Node subject if no subject was given', () => { const dataset = rdf.dataset() const predicate = rdf.namedNode('http://schema.org/knows') const object = rdf.namedNode('http://localhost:8080/data/person/mary-cooper') const cf = clownface({ dataset, term: object }) cf.addIn(predicate) const result = dataset.match(null, predicate, object) assert.strictEqual(result.size, 1) assert.strictEqual([...result][0].subject.termType, 'BlankNode') }) it('should support array values as predicate', () => { const dataset = rdf.dataset() const subject = rdf.namedNode('http://localhost:8080/data/person/bernadette-rostenkowski') const predicateA = rdf.namedNode('http://schema.org/knows') const predicateB = rdf.namedNode('http://schema.org/saw') const object = rdf.namedNode('http://localhost:8080/data/person/mary-cooper') const cf = clownface({ dataset, term: object }) cf.addIn([predicateA, predicateB], subject) const result = addAll( dataset.match(subject, predicateA, object), dataset.match(subject, predicateB, object)) assert.strictEqual(result.size, 2) }) it('should support array values as subject', () => { const dataset = rdf.dataset() const subjectA = rdf.namedNode('http://localhost:8080/data/person/bernadette-rostenkowski') const subjectB = rdf.namedNode('http://localhost:8080/data/person/penny') const predicate = rdf.namedNode('http://schema.org/saw') const object = rdf.namedNode('http://localhost:8080/data/person/mary-cooper') const cf = clownface({ dataset, term: object }) cf.addIn(predicate, [subjectA, subjectB]) const result = addAll( dataset.match(subjectA, predicate, object), dataset.match(subjectB, predicate, object)) assert.strictEqual(result.size, 2) }) it('should call the given function with a context for all added subjects', () => { const dataset = rdf.dataset() const subjectA = rdf.namedNode('http://localhost:8080/data/person/bernadette-rostenkowski') const subjectB = rdf.namedNode('http://localhost:8080/data/person/penny') const predicateA = rdf.namedNode('http://schema.org/knows') const predicateB = rdf.namedNode('http://schema.org/saw') const object = rdf.namedNode('http://localhost:8080/data/person/mary-cooper') const cf = clownface({ dataset, term: object }) let result = null cf.addIn([predicateA, predicateB], [subjectA, subjectB], child => { result = child.values }) assert.deepStrictEqual(result, [subjectA.value, subjectB.value]) }) it('should call the given function with a Blank Node context for the created subject', () => { const dataset = rdf.dataset() const predicate = rdf.namedNode('http://schema.org/knows') const object = rdf.namedNode('http://localhost:8080/data/person/mary-cooper') const cf = clownface({ dataset, term: object }) let result = null cf.addIn(predicate, child => { result = child }) assert.strictEqual(result._context.length, 1) assert.strictEqual(result._context[0].term.termType, 'BlankNode') }) it('should support clownface objects as predicate and subject', () => { const dataset = rdf.dataset() const subject = rdf.namedNode('http://localhost:8080/data/person/bernadette-rostenkowski') const predicate = rdf.namedNode('http://schema.org/knows') const object = rdf.namedNode('http://localhost:8080/data/person/mary-cooper') const cf = clownface({ dataset, term: object }) cf.addIn(cf.node(predicate), cf.node(subject)) const result = dataset.match(subject, predicate, object) assert.strictEqual(result.size, 1) }) it('should return the called object', () => { const dataset = rdf.dataset() const subject = rdf.namedNode('http://localhost:8080/data/person/bernadette-rostenkowski') const predicate = rdf.namedNode('http://schema.org/knows') const object = rdf.namedNode('http://localhost:8080/data/person/mary-cooper') const cf = clownface({ dataset, term: object }) assert.strictEqual(cf.addIn(predicate, subject), cf) }) it('should use the provided factory', () => { const dataset = rdf.dataset() const predicate = rdf.namedNode('http://schema.org/knows') const term = rdf.namedNode('http://localhost:8080/data/person/bernadette-rostenkowski') const factory = new Environment([NamespaceFactory, CustomDataFactory]) const cf = clownface({ dataset, factory, term }).addIn(predicate, 'test') assert.strictEqual(cf.in(predicate).term.testProperty, 'test') cf.dataset.match(null, predicate, null).forEach((quad) => { assert.strictEqual(quad.testProperty, 'test') }) }) it('should not add quads if context is undefined', () => { const dataset = rdf.dataset() const cf = clownface({ dataset }) const subject = rdf.namedNode('http://localhost:8080/data/person/bernadette-rostenkowski') const predicate = rdf.namedNode('http://schema.org/knows') cf.addIn(predicate, subject) assert.strictEqual(dataset.size, 0) }) it('should not call callback function if context is undefined', () => { const dataset = rdf.dataset() const cf = clownface({ dataset }) const subject = rdf.namedNode('http://localhost:8080/data/person/bernadette-rostenkowski') const predicate = rdf.namedNode('http://schema.org/knows') const callback = sinon.spy() cf.addIn(predicate, subject, callback) assert.strictEqual(callback.called, false) }) })