/* eslint quote-props: 0 */
import _ from 'underscore';
import Model from '../src/flux/models/model';
import Attributes from '../src/flux/attributes';
import DatabaseObjectRegistry from '../src/registries/database-object-registry';

class GoodTest extends Model {
  static attributes = _.extend({}, Model.attributes, {
    "foo": Attributes.String({
      modelKey: 'foo',
      jsonKey: 'foo',
    }),
  });
}

describe('DatabaseObjectRegistry', function DatabaseObjectRegistrySpecs() {
  beforeEach(() => DatabaseObjectRegistry.unregister("GoodTest"));

  it("can register constructors", () => {
    const testFn = () => GoodTest;
    expect(() => DatabaseObjectRegistry.register("GoodTest", testFn)).not.toThrow();
    expect(DatabaseObjectRegistry.get("GoodTest")).toBe(GoodTest);
  });

  it("Tests if a constructor is in the registry", () => {
    DatabaseObjectRegistry.register("GoodTest", () => GoodTest);
    expect(DatabaseObjectRegistry.isInRegistry("GoodTest")).toBe(true);
  });

  it("deserializes the objects for a constructor", () => {
    DatabaseObjectRegistry.register("GoodTest", () => GoodTest);
    const obj = DatabaseObjectRegistry.deserialize("GoodTest", {foo: "bar"});
    expect(obj instanceof GoodTest).toBe(true);
    expect(obj.foo).toBe("bar");
  });

  it("throws an error if the object can't be deserialized", () =>
    expect(() => DatabaseObjectRegistry.deserialize("GoodTest", {foo: "bar"})).toThrow()
  );
});