If I am going to run a Dart backend for my Dart Comics sample app, I am going to need a simple data store. Over in node.js-land, I am a big fan of node-dirty. It's ridiculously easy to use and serves as a filesystem datastore for small data sets. So let's see if I can build a passable copy in Dart.
I believe that I am going to need to build this with unit tests. I cannot conceive of a way to spike this into existence. So I get started by creating a dart-dirty directory with a pubspec.yaml file:
name: dart-dirty version: 0.0.1 description: Dirt, simple nosql DB author: Chris StromThe reason that I start here is the dependencies. I use Dart Pub to pull down the SDK's unit test library. I install this dependency withhomepage: https://github.com/eee-c/dart-dirty dependencies: unittest: sdk: unittest
pub install
:➜ dart-dirty git:(master) ✗ pub install Resolving dependencies... Dependencies installed!Then, in
test/dirty_test.dart
, I can import the unittest
library like so:#import('package:unittest/unittest.dart'); test_create() { } main() { test_create(); }For tonight, I will be satisfied if I can create a new (empty) database. If a Dirty object is instantiated with the required path, then a database file at that path should exist:
#import('package:unittest/unittest.dart'); #import('package:dart_dirty/dirty.dart'); #import('dart:io'); test_create() { test("creates a new DB", () { new Dirty('test/test.db'); expect( new File('test/test.db').existsSync(), equals(true) ); }); } main() { test_create(); }I add a skeleton
Dirty
class in lib/dirty.dart
:#library('dart_dirty'); class Dirty { Dirty(path) {} }With that, I have my failing test:
➜ dart-dirty git:(master) ✗ dart test/dirty_test.dart unittest-suite-wait-for-done FAIL: creates a new DB Expected: <true> but: was <false>.To make this test pass, I instantiate a
File
object and open an write stream on it:class Dirty { OutputStream _writeStream; File db; Dirty(path) { db = new File(path); _load(); } _load() { _writeStream = db.openOutputStream(FileMode.APPEND); } }And that does the trick:
➜ dart-dirty git:(master) ✗ dart test/dirty_test.dart unittest-suite-wait-for-done PASS: creates a new DB All 1 tests passed. unittest-suite-successYay!
I do have a bit of a problem. At the start of subsequent test runs, the
test/test.db
database file still exists. I can get rid of it with:main() { before(); test_create(); } before() { var db = new File('test/test.db'); if (!db.existsSync()) return; db.deleteSync(); }I try to delete that in an "after" function as well, but that does not work. The
expect()
function seems to be asynchronous, which means that I try to delete the DB file before it even exists. I will have to investigate if there is a convention for cleaning up after tests in Dart. Tomorrow.To be sure, I have tons to do here, but this a good start. I have both a test file and an actual library file. Tomorrow, I will push through as much functionality as I can.
Day #572
No comments:
Post a Comment