|
1 | 1 | 'use strict' |
2 | 2 |
|
3 | | -/* globals describe, it, afterEach */ |
| 3 | +/* globals describe, it, before, afterEach */ |
4 | 4 |
|
5 | 5 | const sql = require('../../') |
6 | 6 | const assert = require('node:assert') |
@@ -863,4 +863,107 @@ describe('connection string auth - tedious', () => { |
863 | 863 | assert.strictEqual(result, 'UDT_StringArray readonly') |
864 | 864 | }) |
865 | 865 | }) |
| 866 | + |
| 867 | + describe('_poolValidate', () => { |
| 868 | + // Reset Promise in case earlier tests replaced it (e.g. FakePromise) |
| 869 | + before(() => { sql.Promise = Promise }) |
| 870 | + |
| 871 | + function createMockConnection (overrides = {}) { |
| 872 | + return { |
| 873 | + closed: false, |
| 874 | + hasError: false, |
| 875 | + STATE: { LOGGED_IN: 'LoggedIn' }, |
| 876 | + state: { name: 'LoggedIn' }, |
| 877 | + socket: { destroyed: false, writable: true }, |
| 878 | + ...overrides |
| 879 | + } |
| 880 | + } |
| 881 | + |
| 882 | + function createPool (validateConnection) { |
| 883 | + return new ConnectionPool({ validateConnection }) |
| 884 | + } |
| 885 | + |
| 886 | + it('returns false for null connection', () => { |
| 887 | + const pool = createPool(true) |
| 888 | + assert.strictEqual(pool._poolValidate(null), false) |
| 889 | + }) |
| 890 | + |
| 891 | + it('returns false for closed connection', () => { |
| 892 | + const pool = createPool(true) |
| 893 | + assert.strictEqual(pool._poolValidate(createMockConnection({ closed: true })), false) |
| 894 | + }) |
| 895 | + |
| 896 | + it('returns false for errored connection', () => { |
| 897 | + const pool = createPool(true) |
| 898 | + assert.strictEqual(pool._poolValidate(createMockConnection({ hasError: true })), false) |
| 899 | + }) |
| 900 | + |
| 901 | + it('returns true without validation when validateConnection is false', () => { |
| 902 | + const pool = createPool(false) |
| 903 | + assert.strictEqual(pool._poolValidate(createMockConnection()), true) |
| 904 | + }) |
| 905 | + |
| 906 | + it('socket mode: returns true for healthy connection', () => { |
| 907 | + const pool = createPool('socket') |
| 908 | + const conn = createMockConnection() |
| 909 | + conn.STATE.LOGGED_IN = conn.state |
| 910 | + assert.strictEqual(pool._poolValidate(conn), true) |
| 911 | + }) |
| 912 | + |
| 913 | + it('socket mode: returns false when state is not LOGGED_IN', () => { |
| 914 | + const pool = createPool('socket') |
| 915 | + const conn = createMockConnection() |
| 916 | + conn.state = { name: 'SentLogin7WithStandardLogin' } |
| 917 | + assert.strictEqual(pool._poolValidate(conn), false) |
| 918 | + }) |
| 919 | + |
| 920 | + it('socket mode: returns false when socket is destroyed', () => { |
| 921 | + const pool = createPool('socket') |
| 922 | + const conn = createMockConnection() |
| 923 | + conn.STATE.LOGGED_IN = conn.state |
| 924 | + conn.socket = { destroyed: true, writable: false } |
| 925 | + assert.strictEqual(pool._poolValidate(conn), false) |
| 926 | + }) |
| 927 | + |
| 928 | + it('socket mode: returns false when socket is not writable', () => { |
| 929 | + const pool = createPool('socket') |
| 930 | + const conn = createMockConnection() |
| 931 | + conn.STATE.LOGGED_IN = conn.state |
| 932 | + conn.socket = { destroyed: false, writable: false } |
| 933 | + assert.strictEqual(pool._poolValidate(conn), false) |
| 934 | + }) |
| 935 | + |
| 936 | + it('socket mode: returns false when socket is null', () => { |
| 937 | + const pool = createPool('socket') |
| 938 | + const conn = createMockConnection() |
| 939 | + conn.STATE.LOGGED_IN = conn.state |
| 940 | + conn.socket = null |
| 941 | + assert.strictEqual(pool._poolValidate(conn), false) |
| 942 | + }) |
| 943 | + |
| 944 | + it('query mode: returns a promise (SELECT 1)', () => { |
| 945 | + const pool = createPool(true) |
| 946 | + const conn = createMockConnection() |
| 947 | + conn.execSql = (req) => { |
| 948 | + req.callback(null) |
| 949 | + } |
| 950 | + const result = pool._poolValidate(conn) |
| 951 | + assert.ok(result instanceof Promise || (result && typeof result.then === 'function')) |
| 952 | + return Promise.resolve(result).then(valid => { |
| 953 | + assert.strictEqual(valid, true) |
| 954 | + }) |
| 955 | + }) |
| 956 | + |
| 957 | + it('query mode: resolves false on error', () => { |
| 958 | + const pool = createPool(true) |
| 959 | + const conn = createMockConnection() |
| 960 | + conn.execSql = (req) => { |
| 961 | + req.callback(new Error('connection lost')) |
| 962 | + } |
| 963 | + const result = pool._poolValidate(conn) |
| 964 | + return Promise.resolve(result).then(valid => { |
| 965 | + assert.strictEqual(valid, false) |
| 966 | + }) |
| 967 | + }) |
| 968 | + }) |
866 | 969 | }) |
0 commit comments