Skip to content

Commit b51043c

Browse files
committed
sqlite: create sqlite_ignore test cases
1 parent 254680d commit b51043c

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

test/parallel/test-sqlite-authz.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,89 @@ suite('DatabaseSync.prototype.setAuthorizer()', () => {
7171
});
7272
});
7373

74+
it('ignores SELECT operations when authorizer returns SQLITE_IGNORE', () => {
75+
const db = createTestDatabase();
76+
db.prepare('INSERT INTO users (id, name) VALUES (?, ?)').run(1, 'Alice');
77+
78+
db.setAuthorizer((actionCode) => {
79+
if (actionCode === constants.SQLITE_SELECT) {
80+
return constants.SQLITE_IGNORE;
81+
}
82+
return constants.SQLITE_OK;
83+
});
84+
85+
// SELECT should be ignored and return no results
86+
const result = db.prepare('SELECT * FROM users').all();
87+
assert.deepStrictEqual(result, []);
88+
});
89+
90+
it('ignores READ operations when authorizer returns SQLITE_IGNORE', () => {
91+
const db = createTestDatabase();
92+
db.prepare('INSERT INTO users (id, name) VALUES (?, ?)').run(1, 'Alice');
93+
94+
db.setAuthorizer((actionCode, arg1, arg2) => {
95+
if (actionCode === constants.SQLITE_READ && arg1 === 'users' && arg2 === 'name') {
96+
return constants.SQLITE_IGNORE;
97+
}
98+
return constants.SQLITE_OK;
99+
});
100+
101+
// Reading the 'name' column should be ignored, returning NULL
102+
const result = db.prepare('SELECT id, name FROM users WHERE id = 1').get();
103+
assert.strictEqual(result.id, 1);
104+
assert.strictEqual(result.name, null);
105+
});
106+
107+
it('ignores INSERT operations when authorizer returns SQLITE_IGNORE', () => {
108+
const db = createTestDatabase();
109+
110+
db.setAuthorizer((actionCode) => {
111+
if (actionCode === constants.SQLITE_INSERT) {
112+
return constants.SQLITE_IGNORE;
113+
}
114+
return constants.SQLITE_OK;
115+
});
116+
117+
db.prepare('INSERT INTO users (id, name) VALUES (?, ?)').run(1, 'Alice');
118+
119+
// Verify no data was inserted
120+
const count = db.prepare('SELECT COUNT(*) as count FROM users').get();
121+
assert.strictEqual(count.count, 0);
122+
});
123+
124+
it('ignores UPDATE operations when authorizer returns SQLITE_IGNORE', () => {
125+
const db = createTestDatabase();
126+
db.exec("INSERT INTO users (id, name) VALUES (1, 'Alice')");
127+
128+
db.setAuthorizer((actionCode) => {
129+
if (actionCode === constants.SQLITE_UPDATE) {
130+
return constants.SQLITE_IGNORE;
131+
}
132+
return constants.SQLITE_OK;
133+
});
134+
135+
db.prepare('UPDATE users SET name = ? WHERE id = ?').run('Bob', 1);
136+
137+
// Verify data was not updated
138+
const result = db.prepare('SELECT name FROM users WHERE id = 1').get();
139+
assert.strictEqual(result.name, 'Alice');
140+
});
141+
142+
it('ignores DELETE operations when authorizer returns SQLITE_IGNORE', () => {
143+
const db = createTestDatabase();
144+
db.exec("INSERT INTO users (id, name) VALUES (1, 'Alice')");
145+
146+
db.setAuthorizer(() => constants.SQLITE_IGNORE);
147+
148+
db.prepare('DELETE FROM users WHERE id = ?').run(1);
149+
150+
db.setAuthorizer(null);
151+
152+
// Verify data was not deleted
153+
const count = db.prepare('SELECT COUNT(*) as count FROM users').get();
154+
assert.strictEqual(count.count, 1);
155+
});
156+
74157
it('rethrows error when authorizer throws error', () => {
75158
const db = new DatabaseSync(':memory:');
76159
db.setAuthorizer(() => {

0 commit comments

Comments
 (0)