1 | var assert = require('assert');
|
2 | var ok = require('okay');
|
3 | var util = require('util');
|
4 | var query = require('../');
|
5 | var async = require('async');
|
6 | var when = require('when');
|
7 | var sql = require('sql');
|
8 | var pg = require('pg');
|
9 | pg.defaults.poolSize = 1;
|
10 |
|
11 | describe('query', function() {
|
12 | describe('with no values', function() {
|
13 | it('works', function(done) {
|
14 | query('SELECT NOW() as when', function(err, rows, result) {
|
15 | if(err) return done(err);
|
16 | assert(util.isArray(rows));
|
17 | assert.equal(rows.length, 1);
|
18 | assert.equal(rows, result.rows);
|
19 | done();
|
20 | });
|
21 | });
|
22 |
|
23 | it('works with multiple statements (does not prepare)', function(done) {
|
24 | query('SELECT NOW() as when; SELECT NOW() as when;', function(err, rows, result) {
|
25 | if(err) return done(err);
|
26 | assert(util.isArray(rows));
|
27 | assert.equal(rows.length, 2);
|
28 | assert.equal(rows, result.rows);
|
29 | done();
|
30 | });
|
31 | });
|
32 | });
|
33 |
|
34 | describe('with values', function() {
|
35 | it('works', function(done) {
|
36 | query('SELECT $1::text as name', ['brian'], ok(done, function(rows, result) {
|
37 | assert.equal(rows.length, 1);
|
38 | assert.equal(rows[0].name, 'brian');
|
39 | done();
|
40 | }));
|
41 | });
|
42 | });
|
43 |
|
44 | describe('domain binding', function() {
|
45 | it('sticks on proper domain', function(done) {
|
46 | var domain = require('domain').create();
|
47 | domain.run(function() {
|
48 | var existingDomain = process.domain;
|
49 | var runQuery = function(n, next) {
|
50 | query('SELECT NOW()', function(err, rows) {
|
51 | assert.equal(existingDomain, process.domain);
|
52 | next();
|
53 | });
|
54 | };
|
55 | async.times(10, runQuery, function(err) {
|
56 | if(err) return done(err);
|
57 | assert.equal(existingDomain, process.domain);
|
58 | done();
|
59 | });
|
60 | });
|
61 | });
|
62 | });
|
63 |
|
64 | describe('#toQuery interface', function() {
|
65 | before(function(done) {
|
66 | query('CREATE TEMP TABLE "stuff" (id SERIAL PRIMARY KEY, name TEXT)', done);
|
67 | });
|
68 | it('works', function(done) {
|
69 | var table = sql.define({
|
70 | name: 'stuff',
|
71 | columns: ['id', 'name']
|
72 | });
|
73 | query(table.insert({name: 'brian'}), ok(done, function() {
|
74 | query(table.select(), ok(done, function(rows) {
|
75 | assert.equal(rows.length, 1);
|
76 | assert.equal(rows[0].name, 'brian');
|
77 | done();
|
78 | }));
|
79 | }));
|
80 | });
|
81 | });
|
82 |
|
83 | describe('release on error', function() {
|
84 | it('releases client', function(done) {
|
85 | var queryText = 'SELECT ASLKJDLKSFJDS';
|
86 | query(queryText, function(err) {
|
87 | assert(err);
|
88 | done();
|
89 | });
|
90 | });
|
91 | });
|
92 |
|
93 | describe('object config', function() {
|
94 | it('runs query properly', function(done) {
|
95 | var q = {
|
96 | name: 'get time',
|
97 | text: 'SELECT $1::text as name',
|
98 | values: ['brian']
|
99 | }
|
100 | query(q, ok(done, function(rows) {
|
101 | assert.equal(rows[0].name, 'brian')
|
102 | done()
|
103 | }))
|
104 | })
|
105 | })
|
106 |
|
107 | describe('before hook', function() {
|
108 | after(function() {
|
109 | query.before = function() {}
|
110 | });
|
111 | it('calls hook', function(done) {
|
112 | var queryText = 'SELECT $1::text as name';
|
113 | query.before = function(query, client) {
|
114 | assert(query);
|
115 | assert(client);
|
116 | assert.equal(query.text, queryText);
|
117 | assert.equal(query.values.length, 1);
|
118 | assert(client instanceof require('pg').Client);
|
119 | query.on('end', function() {
|
120 | done();
|
121 | });
|
122 | };
|
123 | query(queryText, ['brian'], function() {
|
124 | });
|
125 | });
|
126 | });
|
127 |
|
128 | describe('promise', function(){
|
129 | it('returns a promise if no callback is passed', function(done) {
|
130 | var promise = query('SELECT NOW() as when');
|
131 | assert(when.isPromiseLike(promise));
|
132 | promise.spread(function(rows, result) {
|
133 | assert(util.isArray(rows));
|
134 | assert.equal(result.rows.length, 1);
|
135 | assert.equal(rows, result.rows);
|
136 | done();
|
137 | }).otherwise(done);
|
138 | });
|
139 |
|
140 | it('does not return a promise if callback is passed', function(done) {
|
141 | var noPromise = query('SELECT NOW() as when', function(err, rows, result) {
|
142 | if(err) return done(err);
|
143 | assert(!when.isPromiseLike(noPromise));
|
144 | assert(util.isArray(rows));
|
145 | assert.equal(rows.length, 1);
|
146 | assert.equal(rows, result.rows);
|
147 | done();
|
148 | });
|
149 | });
|
150 | });
|
151 | });
|