1.2.0 • Published 3 years ago

@useful-tools/localstorage v1.2.0

Weekly downloads
-
License
AGPL-3.0
Repository
github
Last release
3 years ago

Localstorage

This package is designed to use localstorage as if it were a no-sql database, allowing to subscribe to changes.

Available methods

Please refer to integration tests to know how the library works.

It should set an entire collection to a specific value and then retrieve it

import LocalStorageDatabase from '@useful-tools/localstorage'

const DEFAULT_COLLECTION = 'test';
const value = [{ name: 'test_document'}];
LocalStorageDatabase.setCollection(DEFAULT_COLLECTION, value);

const currentCollectionValue = LocalStorageDatabase.getCollection(DEFAULT_COLLECTION);

expect(currentCollectionValue).to.be.an('array');
expect(currentCollectionValue).to.has.length(1);
expect(currentCollectionValue[0]).to.be.an('object');
expect(currentCollectionValue[0].name).to.eql('test_document');

It should be able to create a new document, generating a random id if it has not one, and retrieve the document later

import LocalStorageDatabase from '@useful-tools/localstorage'

const document = {
    name: 'test_document'
}

LocalStorageDatabase.createDocument(DEFAULT_COLLECTION, document);
const searchedDocument = LocalStorageDatabase.searchDocument(DEFAULT_COLLECTION, 'name', 'test_document');

expect(searchedDocument).to.be.an('array');
expect(searchedDocument).to.has.length(1);
expect(searchedDocument[0]).to.be.an('object');
expect(searchedDocument[0]).to.has.property('name');
expect(searchedDocument[0]).to.has.property('id');
expect(searchedDocument[0].name).to.eql('test_document');

It should be able to entirely replace a document by another one different

import LocalStorageDatabase from '@useful-tools/localstorage'

const initialDocument = {
    name: 'John Doe',
    job: 'Developer'
}

const replaceDocument = {
    name: 'John Doe',
    fanOf: 'Chuck Norris'
}
// Create the initial document
LocalStorageDatabase.createDocument(DEFAULT_COLLECTION, initialDocument);
// Then replace each document containing John Doe as name, by the replaceDocument
LocalStorageDatabase.setDocument(DEFAULT_COLLECTION, replaceDocument, 'name', 'John Doe');

const currentDocument = LocalStorageDatabase.searchDocument(DEFAULT_COLLECTION, 'name', 'John Doe');

expect(currentDocument).to.be.an('array');
expect(currentDocument).to.has.length(1);
expect(currentDocument[0]).to.be.an('object');
expect(currentDocument[0]).to.has.property('name');
expect(currentDocument[0]).to.has.property('id');
expect(currentDocument[0]).to.has.property('fanOf');
expect(currentDocument[0]).to.not.has.property('job');
expect(currentDocument[0].fanOf).to.eql('Chuck Norris');

It should be able to partially update a document

import LocalStorageDatabase from '@useful-tools/localstorage'

const document = {
    name: 'John Doe',
    job: 'Developer',
    languages: ['Javascript', 'Golang', 'Swift'],
    phoneNumber: '722222222'
}

const updateDocument = {
    phoneNumber: '733333333'
}

LocalStorageDatabase.createDocument(DEFAULT_COLLECTION, document);
LocalStorageDatabase.updateDocument(DEFAULT_COLLECTION, updateDocument, 'name', 'John Doe');

const currentDocument = LocalStorageDatabase.searchDocument(DEFAULT_COLLECTION, 'name', 'John Doe');
expect(currentDocument).to.be.an('array');
expect(currentDocument).to.has.length(1);
expect(currentDocument[0]).to.be.an('object');
expect(currentDocument[0]).to.has.property('name');
expect(currentDocument[0]).to.has.property('job');
expect(currentDocument[0]).to.has.property('languages');
expect(currentDocument[0]).to.has.property('phoneNumber');
expect(currentDocument[0].phoneNumber).to.eql('733333333');

It should be able to delete an entire collection

import LocalStorageDatabase from '@useful-tools/localstorage'

const value = [{ name: 'test_document'}];

LocalStorageDatabase.setCollection(DEFAULT_COLLECTION, value);
const initialCollectionValue = LocalStorageDatabase.getCollection(DEFAULT_COLLECTION);
LocalStorageDatabase.deleteCollection(DEFAULT_COLLECTION);
const postDeleteCollectionValue = LocalStorageDatabase.getCollection(DEFAULT_COLLECTION);

expect(initialCollectionValue).to.be.an('array');
expect(initialCollectionValue).to.has.length(1);
expect(postDeleteCollectionValue).to.be.an('array');
expect(postDeleteCollectionValue).to.has.length(0);

It should be able to delete an entire collection

import LocalStorageDatabase from '@useful-tools/localstorage'

const value = [{ name: 'test_document'}];

LocalStorageDatabase.setCollection(DEFAULT_COLLECTION, value);
const initialCollectionValue = LocalStorageDatabase.getCollection(DEFAULT_COLLECTION);
LocalStorageDatabase.deleteCollection(DEFAULT_COLLECTION);
const postDeleteCollectionValue = LocalStorageDatabase.getCollection(DEFAULT_COLLECTION);

expect(initialCollectionValue).to.be.an('array');
expect(initialCollectionValue).to.has.length(1);
expect(postDeleteCollectionValue).to.be.an('array');
expect(postDeleteCollectionValue).to.has.length(0);

### It should be able to delete a document

import LocalStorageDatabase from '@useful-tools/localstorage'

const document = {
    name: 'test_document'
}

LocalStorageDatabase.createDocument(DEFAULT_COLLECTION, document);
const existingDocument = LocalStorageDatabase.searchDocument(DEFAULT_COLLECTION, 'name', 'test_document');
LocalStorageDatabase.deleteDocument(DEFAULT_COLLECTION, 'name', 'test_document');
const nonExistingDocument = LocalStorageDatabase.searchDocument(DEFAULT_COLLECTION, 'name', 'test_document');

expect(existingDocument).to.be.an('array');
expect(existingDocument).to.have.length(1);
expect(nonExistingDocument).to.be.an('array');
expect(nonExistingDocument).to.have.length(0);

It should be able to send notifications to subscribers when a specific collection is altered

import LocalStorageDatabase from '@useful-tools/localstorage'

const defaultDocument = {test: 'document'};
LocalStorageDatabase.createDocument(DEFAULT_COLLECTION, defaultDocument);

const callback = sinon.stub();
const unsubscribe = LocalStorageDatabase.subscribeToLocalStorage(DEFAULT_COLLECTION, callback);

const document = {
    name: 'new_document'
}
LocalStorageDatabase.createDocument(DEFAULT_COLLECTION, document);
LocalStorageDatabase.deleteDocument(DEFAULT_COLLECTION, 'name', 'new_document');
unsubscribe();

expect(callback.callCount).to.eql(2);
expect(callback.getCall(0).calledWithExactly([defaultDocument, document])).to.eql(true);
expect(callback.getCall(1).calledWithExactly([defaultDocument])).to.eql(true);