Fix tests for new filters, add tests for matching/missing filter, update filter db caches to fix "undefined" instead of null board for global, and change to prevent possible race condition

merge-requests/341/head
Thomas Lynch 10 months ago
parent 8c559efa97
commit 1197a6f06b
  1. 32
      db/filters.js
  2. 2
      test/actions.js
  3. 64
      test/board.js
  4. 55
      test/global.js
  5. 2
      test/integration.test.js
  6. 3
      test/setup.js

@ -31,20 +31,19 @@ module.exports = {
return filters; return filters;
}, },
count: (board) => { count: (board=null) => {
return db.countDocuments({'board': board}); return db.countDocuments({'board': board});
}, },
findOne: (board, id) => { findOne: (board=null, id) => {
return db.findOne({ return db.findOne({
'_id': id, '_id': id,
'board': board, 'board': board,
}); });
}, },
updateOne: (board, id, filters, strictFiltering, filterMode, filterMessage, filterBanDuration, filterBanAppealable) => { updateOne: async (board=null, id, filters, strictFiltering, filterMode, filterMessage, filterBanDuration, filterBanAppealable) => {
cache.del(`filters:${board}`); const updatedFilter = await db.updateOne({
return db.updateOne({
'_id': id, '_id': id,
'board': board, 'board': board,
}, { }, {
@ -57,26 +56,31 @@ module.exports = {
'filterBanAppealable': filterBanAppealable, 'filterBanAppealable': filterBanAppealable,
} }
}); });
await cache.del(`filters:${board}`);
return updatedFilter;
}, },
insertOne: (filter) => { insertOne: async (filter) => {
cache.del(`filters:${filter.board}`); const insertedFilter = await db.insertOne(filter);
return db.insertOne(filter); await cache.del(`filters:${filter.board}`);
return insertedFilter;
}, },
deleteMany: (board, ids) => { deleteMany: async (board=null, ids) => {
cache.del(`filters:${board}`); const deletedFilter = await db.deleteMany({
return db.deleteMany({
'_id': { '_id': {
'$in': ids '$in': ids
}, },
'board': board 'board': board
}); });
await cache.del(`filters:${board}`);
return deletedFilter;
}, },
deleteBoard: (board) => { deleteBoard: async (board=null) => {
cache.del(`filters:${board}`); const deletedFilters = await db.deleteMany({ 'board': board });
return db.deleteMany({ 'board': board }); await cache.del(`filters:${board}`);
return deletedFilters;
}, },
deleteAll: () => { deleteAll: () => {

@ -689,7 +689,7 @@ int main() {...}
_csrf: csrfToken, _csrf: csrfToken,
checkedbans: banId, checkedbans: banId,
option: 'edit_duration', option: 'edit_duration',
ban_duration: '3d', ban_duration: '1s',
}); });
const response = await fetch('http://localhost/forms/global/editbans', { const response = await fetch('http://localhost/forms/global/editbans', {
headers: { headers: {

@ -231,7 +231,7 @@ testing 123`
}); });
let filterId; let filterId;
test('add filter post', async () => { test('add filter to test board', async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
_csrf: csrfToken, _csrf: csrfToken,
filters: `notgood filters: `notgood
@ -252,25 +252,24 @@ bad words`,
redirect: 'manual', redirect: 'manual',
}); });
expect(response.ok).toBe(true); expect(response.ok).toBe(true);
const filterPage = await fetch('http://localhost/test/manage/filter.html', { const filterPage = await fetch('http://localhost/test/manage/filters.html', {
headers: { headers: {
'cookie': sessionCookie, 'cookie': sessionCookie,
}, },
}).then(res => res.text()); }).then(res => res.text());
const checkIndex = filterPage.indexOf('name="checkedfilter" value="'); const checkIndex = filterPage.indexOf('name="checkedfilters" value="');
filterId = filterPage.substring(checkIndex+28, checkIndex+28+24); filterId = filterPage.substring(checkIndex+29, checkIndex+29+24);
}); });
test('edit filter post', async () => { test('edit filter on test board', async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
_csrf: csrfToken, _csrf: csrfToken,
board: test,
filter_id: filterId, filter_id: filterId,
filters: 'edited filters', filters: 'edited filters',
strict_filtering: 'true', strict_filtering: 'true',
filter_mode: '0', filter_mode: '1',
filter_message: 'edited message', filter_message: 'edited message',
filter_ban_duration: '0' filter_ban_duration: '1s'
// filter_ban_appealable omitted to change to false // filter_ban_appealable omitted to change to false
}); });
const response = await fetch('http://localhost/forms/board/test/editfilter', { const response = await fetch('http://localhost/forms/board/test/editfilter', {
@ -283,7 +282,7 @@ bad words`,
redirect: 'manual', redirect: 'manual',
}); });
expect(response.ok).toBe(true); expect(response.ok).toBe(true);
const filterPage = await fetch('http://localhost/test/manage/filter.html', { const filterPage = await fetch('http://localhost/test/manage/filters.html', {
headers: { headers: {
'cookie': sessionCookie, 'cookie': sessionCookie,
}, },
@ -292,10 +291,39 @@ bad words`,
expect(editTextIndex).not.toBe(-1); expect(editTextIndex).not.toBe(-1);
}); });
test('delete filter post', async () => { test('make a post that doesnt hit board filter', async () => {
const params = new URLSearchParams();
params.append('message', 'blahblahblah');
params.append('captcha', '000000');
const response = await fetch('http://localhost/forms/board/test/post', {
headers: {
'x-using-xhr': 'true',
},
method: 'POST',
body: params
});
expect(response.ok).toBe(true);
});
test('make a post that hits board filter', async () => {
const params = new URLSearchParams();
params.append('message', 'edited filters');
params.append('captcha', '000000');
const response = await fetch('http://localhost/forms/board/test/post', {
headers: {
'x-using-xhr': 'true',
},
method: 'POST',
body: params
});
expect(response.ok).not.toBe(true);
await new Promise(res => setTimeout(res, 10000)); //let ban expire
});
test('delete test board filter', async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
_csrf: csrfToken, _csrf: csrfToken,
checkedfilter: filterId, checkedfilters: filterId,
}); });
const response = await fetch('http://localhost/forms/board/test/deletefilter', { const response = await fetch('http://localhost/forms/board/test/deletefilter', {
headers: { headers: {
@ -309,6 +337,20 @@ bad words`,
expect(response.ok).toBe(true); expect(response.ok).toBe(true);
}); });
test('make a post that passes the deleted filter', async () => {
const params = new URLSearchParams();
params.append('message', 'editing filter');
params.append('captcha', '000000');
const response = await fetch('http://localhost/forms/board/test/post', {
headers: {
'x-using-xhr': 'true',
},
method: 'POST',
body: params
});
expect(response.ok).toBe(true);
});
test('add staff', async () => { test('add staff', async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
_csrf: csrfToken, _csrf: csrfToken,

@ -99,7 +99,7 @@ testing 123`
}); });
let filterId; let filterId;
test('add filter post', async () => { test('add global filter', async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
_csrf: csrfToken, _csrf: csrfToken,
filters: `notgood filters: `notgood
@ -120,26 +120,27 @@ bad words`,
redirect: 'manual', redirect: 'manual',
}); });
expect(response.ok).toBe(true); expect(response.ok).toBe(true);
const filterPage = await fetch('http://localhost/globalmanage/filter.html', { const filterPage = await fetch('http://localhost/globalmanage/filters.html', {
headers: { headers: {
'cookie': sessionCookie, 'cookie': sessionCookie,
}, },
}).then(res => res.text()); }).then(res => res.text());
const checkIndex = filterPage.indexOf('name="checkedfilter" value="'); const checkIndex = filterPage.indexOf('name="checkedfilters" value="');
filterId = filterPage.substring(checkIndex+28, checkIndex+28+24); filterId = filterPage.substring(checkIndex+29, checkIndex+29+24);
}); });
test('edit filter post', async () => { test('edit global filter', async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
_csrf: csrfToken, _csrf: csrfToken,
filter_id: filterId, filter_id: filterId,
filters: 'edited filters', filters: 'edited globalfilters',
strict_filtering: 'true', strict_filtering: 'true',
filter_mode: '0', filter_mode: '1',
filter_message: 'edited message', filter_message: 'edited message',
filter_ban_duration: '0' filter_ban_duration: '1s'
// filter_ban_appealable omitted to change to false // filter_ban_appealable omitted to change to false
}); });
console.log(params)
const response = await fetch('http://localhost/forms/global/editfilter', { const response = await fetch('http://localhost/forms/global/editfilter', {
headers: { headers: {
'x-using-xhr': 'true', 'x-using-xhr': 'true',
@ -150,19 +151,49 @@ bad words`,
redirect: 'manual', redirect: 'manual',
}); });
expect(response.ok).toBe(true); expect(response.ok).toBe(true);
const filterPage = await fetch('http://localhost/globalmanage/filter.html', { const filterPage = await fetch('http://localhost/globalmanage/filters.html', {
headers: { headers: {
'cookie': sessionCookie, 'cookie': sessionCookie,
}, },
}).then(res => res.text()); }).then(res => res.text());
const editTextIndex = filterPage.indexOf('edited filters'); console.log(filterPage)
const editTextIndex = filterPage.indexOf('edited globalfilters');
expect(editTextIndex).not.toBe(-1); expect(editTextIndex).not.toBe(-1);
}); });
test('delete filter post', async () => { test('make post that doesnt hit global filter', async () => {
const params = new URLSearchParams();
params.append('message', 'blahblahblah');
params.append('captcha', '000000');
const response = await fetch('http://localhost/forms/board/test/post', {
headers: {
'x-using-xhr': 'true',
},
method: 'POST',
body: params
});
expect(response.ok).toBe(true);
});
test('make post that hits global filter', async () => {
const params = new URLSearchParams();
params.append('message', 'edited globalfilters');
params.append('captcha', '000000');
const response = await fetch('http://localhost/forms/board/test/post', {
headers: {
'x-using-xhr': 'true',
},
method: 'POST',
body: params
});
expect(response.ok).not.toBe(true);
await new Promise(res => setTimeout(res, 10000)); //let ban expire
});
test('delete global filter', async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
_csrf: csrfToken, _csrf: csrfToken,
checkedfilter: filterId, checkedfilters: filterId,
}); });
const response = await fetch('http://localhost/forms/global/deletefilter', { const response = await fetch('http://localhost/forms/global/deletefilter', {
headers: { headers: {

@ -2,8 +2,8 @@ describe('run integration tests', () => {
require('./setup.js')(); require('./setup.js')();
require('./posting.js')(); require('./posting.js')();
require('./global.js')(); require('./global.js')();
require('./actions.js')();
require('./board.js')(); require('./board.js')();
require('./actions.js')();
require('./pages.js')(); require('./pages.js')();
require('./cleanup.js')(); require('./cleanup.js')();
require('./twofactor.js')(); require('./twofactor.js')();

@ -103,7 +103,7 @@ module.exports = () => describe('login and create test board', () => {
archive_links: 'https://archive.today/?run=1&url=%s', archive_links: 'https://archive.today/?run=1&url=%s',
reverse_links: 'https://tineye.com/search?url=%s', reverse_links: 'https://tineye.com/search?url=%s',
prune_modlogs: '30', prune_modlogs: '30',
default_ban_duration: '31536000000', default_ban_duration: '1000',
quote_limit: '25', quote_limit: '25',
preview_replies: '5', preview_replies: '5',
sticky_preview_replies: '5', sticky_preview_replies: '5',
@ -178,6 +178,7 @@ module.exports = () => describe('login and create test board', () => {
global_limits_custom_css_filters: '@\nurl(', global_limits_custom_css_filters: '@\nurl(',
global_limits_custom_css_strict: 'true', global_limits_custom_css_strict: 'true',
global_limits_custom_css_max: '10000', global_limits_custom_css_max: '10000',
global_limits_filters_max: 100,
global_limits_field_length_name: '100', global_limits_field_length_name: '100',
global_limits_field_length_email: '100', global_limits_field_length_email: '100',
global_limits_field_length_subject: '100', global_limits_field_length_subject: '100',

Loading…
Cancel
Save