test('page object composition supports many levels deep', function(assert){
  let definition = {
    foo: {
      bar: {
        baz: "prop"
      }
    }
  };

  let page = create(definition);

  let pageComposer = create({
    bar: {
      baz: page
    }
  });
  assert.ok(pageComposer);
  assert.ok(pageComposer.bar.baz);

  // test that the definition is stored "as is"
  let pageComposerDef = getPageObjectDefinition(pageComposer);
  assert.ok(pageComposerDef);
  assert.ok(pageComposerDef.bar);
  assert.notOk(isPageObject(pageComposerDef.bar));
  assert.ok(pageComposer.bar.baz);
  assert.ok(isPageObject(pageComposerDef.bar.baz));

  let bazDefiniton = getPageObjectDefinition(pageComposerDef.bar.baz);
  assert.ok(bazDefiniton);
  pageComposerDef.bar.baz = bazDefiniton;
  // cant do a true deep equal without firing of page object selectors
  assert.deepEqual(Object.keys(pageComposerDef), ["bar"]);
  assert.deepEqual(bazDefiniton, definition);
});
test('can compose from page object nested within another page object', function(assert){
  const { foo } = create({
    foo: {
      scope: '.foo'
    }
  });

  assert.ok(foo);
  assert.deepEqual(getPageObjectDefinition(foo), { scope: '.foo'}, "nested stores definition");

  const bar = create({ foo });
  assert.ok(bar);

  let barDefinition = getPageObjectDefinition(bar);
  assert.ok(barDefinition);
  assert.ok(barDefinition.foo);
  assert.ok(isPageObject(barDefinition.foo));

  let fooDefFromBar = getPageObjectDefinition(bar.foo);
  assert.ok(fooDefFromBar);
  
  // cannot do a true deep equal since foo is a page object 
  assert.deepEqual(Object.keys(barDefinition), ["foo"]);
  assert.deepEqual(fooDefFromBar, {
    scope: '.foo' 
  });
});
test('page objects can be composed from other page objects', function(assert) {
  let definition = {
    foo: {
      bar: {
        baz: "prop"
      }
    }
  };

  let page = create(definition);
  let pageComposer = create({
    somePage: page
  });
  assert.ok(pageComposer);
  assert.ok(pageComposer.somePage);

  let pageComposerDef = getPageObjectDefinition(pageComposer);
  assert.ok(pageComposerDef);
  assert.ok(isPageObject(pageComposerDef.somePage));
  // we cant deep equal the definition since it contains a page object so we check the keys instead
  assert.deepEqual(Object.keys(pageComposerDef), ['somePage']);
  let somePageStoredDef = getPageObjectDefinition(pageComposerDef.somePage);
  assert.deepEqual(somePageStoredDef, definition);
});