@Test
  public void createWithStream_forNewContent_shouldCreateContent() throws IOException {
    // Given
    // we create some content
    FlatsyDatabase db = new FlatsyFlatFileDatabase(root);
    String uri = "births/data.json";
    String uriNew = "births/new.json";

    // When
    // we copy the file
    try (InputStream stream = Files.newInputStream(root.resolve(uri))) {
      db.create(new FlatsyObject(uriNew, db), stream);
    }

    // Then
    // files and folders exist and when we retrieve the file it has the content
    assertEquals(db.retrieve(new FlatsyObject(uri, db)), db.retrieve(new FlatsyObject(uriNew, db)));
  }
  @Test
  public void retrieve_forInvalidURI_shouldReturnNull() throws IOException {
    // Given
    // a database
    FlatsyDatabase db = new FlatsyFlatFileDatabase(root);

    // When
    // we retrieve a valid uri
    FlatsyObject object = new FlatsyObject("bingy/bangy/bong.json", db);
    String invalidString = db.retrieve(object);

    // Then
    // we expect to have file content
    assertNull(invalidString);
  }
  @Test
  public void create_newContentForExistingFolder_shouldCreateFile() throws IOException {
    // Given
    // we create some content
    FlatsyDatabase db = new FlatsyFlatFileDatabase(root);
    String newContent = "This is new content";
    String newURI = "births/foo.json";

    // When
    // we create the file
    FlatsyObject object = new FlatsyObject(newURI, db);
    db.create(object, newContent);

    // Then
    // when we retrieve the file it has the content
    assertEquals(newContent, db.retrieve(new FlatsyObject(newURI, db)));
  }
  @Test
  public void create_forExistingContent_shouldOverwrite() throws IOException {
    // Given
    // we create some content
    FlatsyDatabase db = new FlatsyFlatFileDatabase(root);
    String content = "This is original content";
    String uri = "births/original.json";
    db.create(new FlatsyObject(uri, db), content);

    // When
    // we create new content
    String newContent = "This is new content";
    db.create(new FlatsyObject(uri, db), newContent);

    // Then
    // when we retrieve the file it has the content
    assertEquals(newContent, db.retrieve(new FlatsyObject(uri, db)));
  }
  @Test
  public void create_newContentForNonExistingFolder_shouldCreateStructure() throws IOException {
    // Given
    // we create some content
    FlatsyDatabase db = new FlatsyFlatFileDatabase(root);
    String newContent = "This is new content";
    String newURI = "births/flatsyTest/foo.json";
    String newFolderURI = "births/flatsyTest";

    // When
    // we create the file
    FlatsyObject object = new FlatsyObject(newURI, db);
    db.create(object, newContent);

    // Then
    // files and folders exist and when we retrieve the file it has the content
    assertEquals(FlatsyObjectType.JSONFile, db.type(newURI));
    assertEquals(FlatsyObjectType.Folder, db.type(newFolderURI));
    assertEquals(newContent, db.retrieve(new FlatsyObject(newURI, db)));
  }
  @Test
  public void retrieveFromStream_givenFile_shouldReturnStreamForRetrieve() throws IOException {
    // Given
    // a database
    FlatsyDatabase db = new FlatsyFlatFileDatabase(root);

    // When
    // we retrieve a valid uri
    String retrieved = null;
    FlatsyObject object = new FlatsyObject("births/data.json", db);

    try (InputStream stream = db.retrieveStream(object)) {
      StringWriter writer = new StringWriter();
      IOUtils.copy(stream, writer, "UTF8");
      retrieved = writer.toString();
    }

    // Then
    // we compare to regular (and already tested) retrieve
    assertEquals(db.retrieve(object), retrieved);
  }