Home Reference Source Test

test/DataObjectsStorage.spec.js

import chai from 'chai';
import chaiAsPromised from 'chai-as-promised';

import DataObjectsStorage from '../src/store-objects/DataObjectsStorage';
import { runtimeFactory } from './resources/runtimeFactory';

chai.config.truncateThreshold = 0;

let expect = chai.expect;
chai.use(chaiAsPromised);

describe('dataObjectsStorage', function() {

  let storageManager;
  let dataObjectsStorage;
  let runtimeURL = 'hyperty-runtime://fake-runtime';
  let syncherManagerURL = runtimeURL + '/sm';

  let owner = 'hyperty://<domain>/id-owner';
  let url = 'resource://obj1';
  let userURL = 'user://<domain>/<my-name>';
  let schema = 'schema://fake-schema-url';
  let schemaList = ['schema://fake-schema-url/Communication', 'schema://fake-schema-url/Context', 'schema://fake-schema-url/Connection'];

  before(() => {

    storageManager = runtimeFactory.storageManager();
    dataObjectsStorage = new DataObjectsStorage(storageManager, {});

  });

  it('should set dataObject information to be saved on storage', (done) => {

    let metadata = {};

    metadata.status = 'live';
    metadata.isReporter = true;
    let data = {
      x: 1,
      y: 2
    };
    metadata.schema = schema;
    metadata.url = url;
    metadata.name = 'WebRTC';
    metadata.subscriberUsers = [];
    metadata.subscriptions = [];
    metadata.version = 0;
    metadata.reporter = 'hyperty://<domain>/id-3';
    let subscriberHyperty = 'hyperty://<domain>/id-2';
    let childrenObjects = {};
    childrenObjects[metadata.reporter + '#1'] = { message: 'message 1' };
    childrenObjects[subscriberHyperty + '#1'] = { message: 'message 2' };
    childrenObjects[metadata.reporter + '#2'] = { message: 'message 3' };

    expect(dataObjectsStorage.set(metadata))
    .to.have.keys('url', 'isReporter', 'subscriberUsers', 'subscriptions', 'version', 'schema', 'status', 'reporter', 'name', 'childrenObjects', 'data');

    expect(dataObjectsStorage.saveData(true, url, null, data)).to.be.deep.equal({
      url: metadata.url,
      isReporter: metadata.isReporter,
      subscriptions: [],
      subscriberUsers: [],
      data: data,
      version: 0,
      schema: metadata.schema,
      status: metadata.status,
      reporter: metadata.reporter,
      childrenObjects: {},
      name: metadata.name
    });

    expect(dataObjectsStorage.saveChildrens(true, metadata.url, null, childrenObjects)).to.deep.equal({
      url: metadata.url,
      isReporter: metadata.isReporter,
      subscriptions: [],
      subscriberUsers: [],
      schema: metadata.schema,
      status: metadata.status,
      reporter: metadata.reporter,
      data: data,
      childrenObjects: childrenObjects,
      version: 0,
      name: metadata.name
    });

    expect(dataObjectsStorage.update(metadata.isReporter, metadata.url, 'subscriptions', subscriberHyperty)).to.be.deep.equal({
      url: metadata.url,
      isReporter: metadata.isReporter,
      subscriptions: [subscriberHyperty],
      subscriberUsers: [],
      schema: schema,
      status: metadata.status,
      reporter: metadata.reporter,
      data: data,
      childrenObjects: childrenObjects,
      version: 0,
      name: metadata.name
    });

    done();

  });

  it('should set a bundle of information to be saved on storage like reporter', (done) => {

    let num = 4;

    for (let i = 0; i < num; i++) {

      let metadata = {};

      metadata.status = 'live';
      metadata.version = 0;
      metadata.isReporter = true;
      metadata.url = '<scheme>://<domain>/id-' + i;
      let rand = Math.round(Math.random() * 2);
      metadata.schema = schemaList[rand];
      metadata.reporter = 'hyperty://<domain>/id-' + (num - i);
      let subscriberHyperty = 'hyperty://<domain>/id-' + ((num - i) * 2);

      // resource, isReporter, schema, status, data, subscription, children, childrenResources, subscriberUser
      expect(dataObjectsStorage.set(metadata)).to.be.deep.equal({
        url: metadata.url,
        isReporter: metadata.isReporter,
        subscriptions: [],
        subscriberUsers: [],
        childrenObjects: {},
        data: {},
        version: 0,
        schema: metadata.schema,
        status: metadata.status,
        reporter: metadata.reporter
      });

      expect(dataObjectsStorage.update(metadata.isReporter, metadata.url, 'store', true)).to.be.deep.equal({
        url: metadata.url,
        isReporter: metadata.isReporter,
        subscriptions: [],
        subscriberUsers: [],
        childrenObjects: {},
        data: {},
        version: 0,
        schema: metadata.schema,
        status: metadata.status,
        reporter: metadata.reporter,
        store: true
      });

      expect(dataObjectsStorage.saveData(metadata.isReporter, metadata.url, 'participants.1', {name: 'vitor', last: 'silva'})).to.be.deep.equal({
        url: metadata.url,
        isReporter: metadata.isReporter,
        subscriptions: [],
        subscriberUsers: [],
        childrenObjects: {},
        version: 0,
        schema: metadata.schema,
        status: metadata.status,
        reporter: metadata.reporter,
        store: true,
        data: {
          participants: {
            1: {
              name: 'vitor', last: 'silva'
            }
          }
        }
      });

      expect(dataObjectsStorage.update(metadata.isReporter, metadata.url, 'subscriptions', subscriberHyperty)).to.be.deep.equal({
        url: metadata.url,
        isReporter: metadata.isReporter,
        subscriptions: [subscriberHyperty],
        subscriberUsers: [],
        childrenObjects: {},
        version: 0,
        schema: metadata.schema,
        status: metadata.status,
        reporter: metadata.reporter,
        store: true,
        data: {
          participants: {
            1: {
              name: 'vitor', last: 'silva'
            }
          }
        }
      });

      if (i === num - 1) {
        console.log('DONE', i);
        done();
      }
    }

  });

  it('should set a bundle of information to be saved on storage like observers', (done) => {

    let num = 4;
    let letters = ['A', 'B', 'C', 'D'];

    for (let i = 0; i < num; i++) {

      let metadata = {};

      metadata.status = 'live';
      metadata.version = 0;
      metadata.isReporter = false;
      metadata.url = '<scheme>://<domain>/id-' + letters[i];
      let rand = Math.round(Math.random() * 2);
      metadata.schema = schemaList[rand];
      metadata.reporter = 'hyperty://<domain>/id-' + (num - i);
      let subscriberHyperty = 'hyperty://<domain>/id-' + letters[(num - i)];

      // resource, isReporter, schema, status, data, subscription, children, childrenResources, subscriberUser
      expect(dataObjectsStorage.set(metadata)).to.be.deep.equal({
        url: metadata.url,
        isReporter: metadata.isReporter,
        subscriptions: [],
        subscriberUsers: [],
        childrenObjects: {},
        data: {},
        version: 0,
        schema: metadata.schema,
        status: metadata.status,
        reporter: metadata.reporter
      });

      if (i === num - 1) {
        done();
      }
    }

  });

  it('should update a resource with new Hyperty Subscribers', (done) => {
    let url = '<scheme>://<domain>/id-2';
    let hypertySubscribers = ['hyperty://<domain>/id-3', 'hyperty://<domain>/id-2'];
    let isReporter = true;

    expect(dataObjectsStorage.update(isReporter, url, 'hypertySubscribers', hypertySubscribers[0]).hypertySubscribers).to.contains(hypertySubscribers[0], hypertySubscribers[1]);

    // .to.have.deep.property('subscriptions', ['hyperty://<domain>/id-4', 'hyperty://<domain>/id-3']);

    // expect(dataObjectsStorage._storeDataObject[type][resource].subscriptions).to.contains(subscriptions[0], subscriptions[1]);
    done();
  });

  it('should update a resource with new Subscriber Users', (done) => {
    let resource = '<scheme>://<domain>/id-2';
    let isReporter = true;

    expect(dataObjectsStorage.update(isReporter, resource, 'subscriberUsers', userURL).subscriberUsers).to.contains(userURL);
    done();
  });

  // it('should update the data resource', (done) => {
  //   let resource = '<scheme>://<domain>/id-2';
  //   let isReporter = true;
  //   dataObjectsStorage.updateData(resource, 'subscriberUsers', userURL, isReporter);
  //
  //   let type = isReporter ? 'reporters' : 'observers';
  //
  //   expect(dataObjectsStorage._storeDataObject[type][resource].subscriberUsers).to.contains(userURL);
  //   done();
  // });

  it('should get specific dataObject by hypertyURL', (done) => {

    let msg = {
      type: 'create',
      from: 'hyperty://<domain>/id-2',
      to: syncherManagerURL
    };

    expect(dataObjectsStorage.getResourcesByCriteria(msg, true))
    .to.be.fulfilled
    .and.eventually.to.include.keys('<scheme>://<domain>/id-2')
    .and.notify(done);

  });

  it('should get specific dataObject by identity', (done) => {

    let msg = {
      type: 'create',
      from: 'hyperty://<domain>/id-3',
      to: syncherManagerURL,
      body: {
        identity: userURL
      }

    };

    expect(dataObjectsStorage.getResourcesByCriteria(msg, true))
    .to.be.fulfilled
    .and.eventually.to.include.keys('<scheme>://<domain>/id-2')
    .and.notify(done);

  });

  it('should get specific dataObject by schema', (done) => {

    let msg = {
      type: 'create',
      from: 'hyperty://<domain>/id-3',
      to: syncherManagerURL,
      body: {
        schema: schema
      }

    };

    expect(dataObjectsStorage.getResourcesByCriteria(msg, true))
    .to.be.fulfilled
    .and.eventually.to.include.keys(url)
    .and.notify(done);

  });

  it('should get specific dataObject by some data', (done) => {

    let msg = {
      type: 'create',
      from: 'hyperty://<domain>/id-3',
      to: syncherManagerURL,
      body: {
        value: {
          name: 'WebRTC'
        }
      }

    };

    expect(dataObjectsStorage.getResourcesByCriteria(msg, true))
    .to.be.fulfilled
    .and.eventually.to.include.keys(url)
    .and.notify(done);

  });

  it('should delete a specific value from specific resource', (done) => {
    let resource = '<scheme>://<domain>/id-3';
    let subscription = 'hyperty://<domain>/id-1';
    dataObjectsStorage.delete(resource, 'subscriptions', subscription);

    done();
  });

  it('should not delete a resource', (done) => {
    let resource = '<scheme>://<domain>/id-8';
    expect(dataObjectsStorage.deleteResource(resource)).to.be.fulfilled
    .and.eventually.to.be.eq('The ' + resource + ' dosen\t exists, nothing was deleted').and.notify(done);
  });

  it('should delete a resource', (done) => {
    let resource = '<scheme>://<domain>/id-1';
    expect(dataObjectsStorage.deleteResource(resource))
    .to.be.fulfilled
    .and.eventually.to.be.undefined.and.notify(done);
  });

});