mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-02-17 07:33:57 +00:00
208 lines
8.3 KiB
JavaScript
208 lines
8.3 KiB
JavaScript
import config from '../lib/config'
|
|
import WebDAV from '../lib/WebDAV'
|
|
import TestUtility from '../lib/utilities'
|
|
import Preferences from '../lib/Preferences'
|
|
import ManageSieve from '../lib/ManageSieve'
|
|
|
|
let prefs, webdav, utility, manageSieve, user
|
|
|
|
beforeAll(function () {
|
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = config.timeout || 10000;
|
|
});
|
|
|
|
describe('Sieve', function() {
|
|
|
|
async function _getSogoSieveScript() {
|
|
await manageSieve.authenticate(true)
|
|
const scripts = await manageSieve.listScripts()
|
|
|
|
expect(Object.keys(scripts))
|
|
.withContext(`sogo sieve script has been created`)
|
|
.toContain('sogo')
|
|
expect(scripts['sogo'])
|
|
.withContext(`sogo sieve script is active`)
|
|
.toMatch(/ACTIVE/i)
|
|
|
|
const script = await manageSieve.getScript('sogo')
|
|
|
|
return script
|
|
}
|
|
|
|
async function _killFilters() {
|
|
// kill existing filters
|
|
await prefs.setOrCreate('SOGoSieveFilters', [], ['defaults'])
|
|
// vacation filters
|
|
await prefs.setOrCreate('enabled', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('autoReplyText', '', ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('customSubjectEnabled', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('customSubject', '', ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('autoReplyEmailAddresses', [], ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('daysBetweenResponse', 7, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('ignoreLists', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('startDateEnabled', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('startDate', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('startTimeEnabled', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('startTime', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('endDateEnabled', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('endDate', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('endTimeEnabled', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('endTime', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('weekdaysEnabled', 0, ['defaults', 'Vacation'])
|
|
await prefs.setOrCreate('days', [], ['defaults', 'Vacation'])
|
|
// forwarding filters
|
|
await prefs.setOrCreate('forwardAddress', [], ['defaults', 'Forward'])
|
|
await prefs.setOrCreate('keepCopy', 0, ['defaults', 'Forward'])
|
|
}
|
|
|
|
beforeAll(async function() {
|
|
prefs = new Preferences(config.username, config.password)
|
|
webdav = new WebDAV(config.username, config.password)
|
|
utility = new TestUtility(webdav)
|
|
manageSieve = new ManageSieve(config.username, config.username, config.password)
|
|
user = await utility.fetchUserInfo(config.username)
|
|
})
|
|
|
|
beforeEach(async function() {
|
|
await _killFilters()
|
|
})
|
|
|
|
afterAll(async function() {
|
|
await _killFilters()
|
|
await prefs.save()
|
|
})
|
|
|
|
it('enable simple vacation script', async function() {
|
|
const vacationMsg = 'vacation test'
|
|
const daysInterval = 5
|
|
const mailaddr = user.email.replace(/mailto:/, '')
|
|
const sieveSimpleVacation = `require ["vacation"];\r\nvacation :days ${daysInterval} :addresses ["${mailaddr}"] text:\r\n${vacationMsg}\r\n.\r\n;\r\n`
|
|
let vacation
|
|
|
|
vacation = await prefs.get('Vacation')
|
|
vacation.enabled = 1
|
|
await prefs.setNoSave('autoReplyText', vacationMsg)
|
|
await prefs.setNoSave('daysBetweenResponse', daysInterval)
|
|
await prefs.setNoSave('autoReplyEmailAddresses', [mailaddr])
|
|
await prefs.save()
|
|
|
|
const createdScript = await _getSogoSieveScript()
|
|
expect(createdScript)
|
|
.withContext(`sogo Sieve script`)
|
|
.toBe(sieveSimpleVacation)
|
|
})
|
|
|
|
it('enable vacation script - ignore lists', async function() {
|
|
const vacationMsg = 'vacation test - ignore list'
|
|
const daysInterval = 3
|
|
const mailaddr = user.email.replace(/mailto:/, '')
|
|
const sieveVacationIgnoreLists = `require ["vacation"];\r\nif allof ( not exists ["list-help", "list-unsubscribe", "list-subscribe", "list-owner", "list-post", "list-archive", "list-id", "Mailing-List"], not header :comparator "i;ascii-casemap" :is "Precedence" ["list", "bulk", "junk"], not header :comparator "i;ascii-casemap" :matches "To" "Multiple recipients of*" ) { vacation :days ${daysInterval} :addresses ["${mailaddr}"] text:\r\n${vacationMsg}\r\n.\r\n;\r\n}\r\n`
|
|
let vacation
|
|
|
|
vacation = await prefs.get('Vacation')
|
|
vacation.enabled = 1
|
|
await prefs.setNoSave('autoReplyText', vacationMsg)
|
|
await prefs.setNoSave('daysBetweenResponse', daysInterval)
|
|
await prefs.setNoSave('autoReplyEmailAddresses', [mailaddr])
|
|
await prefs.setNoSave('ignoreLists', 1)
|
|
await prefs.save()
|
|
|
|
const createdScript = await _getSogoSieveScript()
|
|
expect(createdScript)
|
|
.withContext(`sogo Sieve script`)
|
|
.toBe(sieveVacationIgnoreLists)
|
|
})
|
|
|
|
it('enable vacation script - activation constraints', async function() {
|
|
const vacationMsg = 'vacation test - activation constraints'
|
|
const daysInterval = 2
|
|
const mailaddr = user.email.replace(/mailto:/, '')
|
|
const now = new Date()
|
|
const tomorrow = new Date(now.getTime() + 1000*60*60*24)
|
|
const startDate = tomorrow.getFullYear() + '-' + [
|
|
'0' + (tomorrow.getMonth() + 1),
|
|
'0' + tomorrow.getDate()
|
|
].map(component => component.slice(-2)).join('-')
|
|
const startTime = '17:00'
|
|
const timezone = (user.timezone < 0 ? '-':'+') + ('000' + Math.abs(user.timezone)).slice(-4)
|
|
const sieveVacationConstraints = `require ["vacation","date","relational"];\r\nif allof ( currentdate :value "ge" "date" "${startDate}", date :value "ge" :zone "${timezone}" "date" "time" "${startTime}:00" ) { vacation :days ${daysInterval} :addresses ["${mailaddr}"] text:\r\n${vacationMsg}\r\n.\r\n;\r\n}\r\n`
|
|
let vacation
|
|
|
|
vacation = await prefs.get('Vacation')
|
|
vacation.enabled = 1
|
|
await prefs.setNoSave('autoReplyText', vacationMsg)
|
|
await prefs.setNoSave('daysBetweenResponse', daysInterval)
|
|
await prefs.setNoSave('autoReplyEmailAddresses', [mailaddr])
|
|
await prefs.setNoSave('startDateEnabled', 1)
|
|
await prefs.setNoSave('startDate', tomorrow.getTime() / 1000)
|
|
await prefs.setNoSave('startTimeEnabled', 1)
|
|
await prefs.setNoSave('startTime', startTime)
|
|
await prefs.save()
|
|
|
|
const createdScript = await _getSogoSieveScript()
|
|
expect(createdScript)
|
|
.withContext(`sogo Sieve script`)
|
|
.toBe(sieveVacationConstraints)
|
|
})
|
|
|
|
it('enable simple forwarding', async function() {
|
|
const redirectMailaddr = 'nonexistent@inverse.com'
|
|
const sieveSimpleForward = `redirect "${redirectMailaddr}";\r\n`
|
|
let forward
|
|
|
|
// Enabling Forward now is an 'enabled' setting in the subdict Forward
|
|
// We need to get that subdict first -- next save/set will also save this
|
|
forward = await prefs.get('Forward')
|
|
forward.enabled = 1
|
|
await prefs.set('forwardAddress', [redirectMailaddr])
|
|
|
|
const createdScript = await _getSogoSieveScript()
|
|
expect(createdScript)
|
|
.withContext(`sogo Sieve script`)
|
|
.toBe(sieveSimpleForward)
|
|
})
|
|
|
|
it('enable email forwarding - keep a copy', async function() {
|
|
const redirectMailaddr = 'nonexistent@inverse.com'
|
|
const sieveForwardKeep = `redirect "${redirectMailaddr}";\r\nkeep;\r\n`
|
|
let forward
|
|
|
|
// Enabling Forward now is an 'enabled' setting in the subdict Forward
|
|
// We need to get that subdict first -- next save/set will also save this
|
|
forward = await prefs.get('Forward')
|
|
forward.enabled = 1
|
|
await prefs.setNoSave('forwardAddress', [redirectMailaddr])
|
|
await prefs.setNoSave('keepCopy', 1)
|
|
await prefs.save()
|
|
|
|
const createdScript = await _getSogoSieveScript()
|
|
expect(createdScript)
|
|
.withContext(`sogo Sieve script`)
|
|
.toBe(sieveForwardKeep)
|
|
})
|
|
|
|
it('add simple sieve filter', async function() {
|
|
const folderName = 'Sent'
|
|
const subject = 'add simple sieve filter'
|
|
const sieveFilter = `require ["fileinto"];\r\nif anyof (header :contains "subject" "${subject}") {\r\n fileinto "${folderName}";\r\n}\r\n`
|
|
|
|
await prefs.set('SOGoSieveFilters', [{
|
|
active: true,
|
|
actions: [{
|
|
method: 'fileinto',
|
|
argument: 'Sent'
|
|
}],
|
|
rules: [{
|
|
operator: 'contains',
|
|
field: 'subject',
|
|
value: subject
|
|
}],
|
|
match: 'any',
|
|
name: folderName
|
|
}])
|
|
|
|
const createdScript = await _getSogoSieveScript()
|
|
expect(createdScript)
|
|
.withContext(`sogo Sieve script`)
|
|
.toBe(sieveFilter)
|
|
})
|
|
}) |