mercredi 6 mai 2015

How to make unit tests for Redstone with PostgreSQL?

I'm trying to make unit tests for Redstone microframework with PostgreSQL extension. Test of simple Route without pgsql request works fine. But when Route contains pgsql requests test fails because resp.statusCode=500. When I call application function with pgsql request directly from test it returns error because app.request is null. Here is code sample:

//--------------------------------------------------------
// Redstone application
library rs_app;
import 'dart:async';
import 'package:redstone/server.dart' as app;
import 'package:redstone_mapper/plugin.dart';
import 'package:redstone_mapper_pg/manager.dart';

Future startServer() {
  var uri = "postgres://127.0.0.1:5432/testdb";
  var dbManager = new PostgreSqlManager(uri, min: 1, max: 3);
  app.addPlugin(getMapperPlugin(dbManager));
  app.setupConsoleLog();
  return app.start(address: '127.0.0.1', port: 8100);
}

PostgreSql get pgsql => app.request.attributes.dbConn;

@app.Route("/simple")
simpleAnswer() => "Hello, world!";

@app.Route("/complex")
complexAnswer() => getMaxId();

Future getMaxId() {
  return pgsql.query("select max(id) as id from t_test", String)
  .then((id) {
    return new Future.value(id[0]['id']);
  });
}

//--------------------------------------------------------
// Unit tests
library rs_app_test;
import 'package:rs_app/rs_app.dart' as rs_app;
import 'package:redstone/server.dart' as app;
import 'package:redstone/mocks.dart';
import 'package:unittest/unittest.dart';

main() => makeTests();

void makeTests() {
  setUp(() => app.setUp([#rs_app]));
  tearDown(() => app.tearDown());
  test('simple - PASS', () {
    var req = new MockRequest('/simple');
    return app.dispatch(req).then((resp) {
      expect(resp.statusCode, equals(200));
      expect(resp.mockContent, equals("Hello, world!"));
    });
  });
  test('complex - FAIL', () {
    var req = new MockRequest('/complex');
    return app.dispatch(req).then((resp) {
      expect(resp.statusCode, equals(200));
      expect(resp.mockContent, equals("0297"));
    });
  });
  test('direct - ERROR', () {
    return rs_app.getMaxId().then((id) {
      expect(id, equals("0297"));
    });
  });
}

I understand that dbManager is not initialized correctly, but how I must initialize it?

Aucun commentaire:

Enregistrer un commentaire