From 2b101a87b8d67eeb2f83428a0babc6501e5cb4a5 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Mon, 4 Oct 2021 13:47:02 -0400 Subject: [PATCH] test: migration from Python to JavaScript --- Tests/lib/WebDAV.js | 13 ++- Tests/lib/utilities.js | 10 +- Tests/spec/CalDAVPreventInvitationsSpec.js | 2 +- Tests/spec/CalDAVSchedulingSpec.js | 2 +- Tests/spec/CardDAVSpec.js | 130 +++++++++++++++++++++ Tests/spec/DAVAddressBookAclSpec.js | 2 +- Tests/spec/DAVCalendarAclSpec.js | 4 +- Tests/spec/DAVCalendarSuperUserAclSpec.js | 2 +- 8 files changed, 151 insertions(+), 14 deletions(-) create mode 100644 Tests/spec/CardDAVSpec.js diff --git a/Tests/lib/WebDAV.js b/Tests/lib/WebDAV.js index 3794ce40f..6ca7ad2de 100644 --- a/Tests/lib/WebDAV.js +++ b/Tests/lib/WebDAV.js @@ -77,9 +77,16 @@ class WebDAV { }) } - getEvent(resource, filename) { + getObject(resource, filename) { + let url + if (resource.match(/^http/)) + url = resource + else + url = this.serverUrl + resource + if (filename) + url += filename return davRequest({ - url: this.serverUrl + resource + filename, + url, init: { method: 'GET', headers: this.headers, @@ -380,7 +387,7 @@ class WebDAV { }) } - makeAddressBook(resource) { + makeCollection(resource) { return makeCollection({ url: this.serverUrl + resource, headers: this.headers diff --git a/Tests/lib/utilities.js b/Tests/lib/utilities.js index 55e8d3f0f..2440186bc 100644 --- a/Tests/lib/utilities.js +++ b/Tests/lib/utilities.js @@ -143,8 +143,8 @@ class TestUtility { return this._subscriptionOperation(resource, subscribers, 'unsubscribe') } - versitDict(cal) { - const comp = ICAL.Component.fromString(cal) + versitDict(component) { + const comp = ICAL.Component.fromString(component) let props = {} for (const prop of comp.getAllProperties()) { @@ -158,9 +158,9 @@ class TestUtility { return props } - calendarsAreEqual(cal1, cal2) { - const props1 = this.versitDict(cal1) - const props2 = this.versitDict(cal2) + componentsAreEqual(comp1, comp2) { + const props1 = this.versitDict(comp1) + const props2 = this.versitDict(comp2) for (const prop of Object.keys(props1)) { if (props1[prop] != props2[prop]) { console.debug(`Difference detected in ${prop}:\n\t1: ${props1[prop]}\n\t2: ${props2[prop]}`) diff --git a/Tests/spec/CalDAVPreventInvitationsSpec.js b/Tests/spec/CalDAVPreventInvitationsSpec.js index 995d5131d..7614dc539 100644 --- a/Tests/spec/CalDAVPreventInvitationsSpec.js +++ b/Tests/spec/CalDAVPreventInvitationsSpec.js @@ -16,7 +16,7 @@ let icsName, icsList, vcalendar describe('PreventInvitationsWhitelist user setting', function() { const _getEvent = async function(client, calendarName, filename, expectedCode = 200) { - const [{ status, headers, raw }] = await client.getEvent(calendarName, filename) + const [{ status, headers, raw }] = await client.getObject(calendarName, filename) expect(status).toBe(expectedCode) if (status <= 300) return new ICAL.Component(ICAL.parse(raw)) diff --git a/Tests/spec/CalDAVSchedulingSpec.js b/Tests/spec/CalDAVSchedulingSpec.js index 1de4caabf..34f914cd4 100644 --- a/Tests/spec/CalDAVSchedulingSpec.js +++ b/Tests/spec/CalDAVSchedulingSpec.js @@ -26,7 +26,7 @@ describe('create, read, modify, delete tasks for regular user', function() { let icsList = [] const _getEvent = async function(client, calendarName, filename, expectedCode = 200) { - const [{ status, raw }] = await client.getEvent(calendarName, filename) + const [{ status, raw }] = await client.getObject(calendarName, filename) expect(status).toBe(expectedCode) if (status <= 300) return new ICAL.Component(ICAL.parse(raw)) diff --git a/Tests/spec/CardDAVSpec.js b/Tests/spec/CardDAVSpec.js new file mode 100644 index 000000000..32fe5a600 --- /dev/null +++ b/Tests/spec/CardDAVSpec.js @@ -0,0 +1,130 @@ +import config from '../lib/config' +import WebDAV from '../lib/WebDAV' +import TestUtility from '../lib/utilities' + +import { + DAVNamespace, + DAVNamespaceShorthandMap, + davRequest +} from 'tsdav' +import { formatProps, getDAVAttribute } from 'tsdav/dist/util/requestHelpers'; + +const cards = { + 'new.vcf': `BEGIN:VCARD +VERSION:3.0 +PRODID:-//Inverse//Card Generator//EN +UID:NEWTESTCARD +N:New;Carte +FN:Carte 'new' +ORG:societe;service +NICKNAME:surnom +ADR;TYPE=work:adr2 societe;;adr societe;ville societe;etat soc;code soc;pays soc +ADR;TYPE=home:rue perso 2;;rue perso;ville perso;etat perso;code post perso;pays perso +TEL;TYPE=work:+1 514 123-3372 +TEL;TYPE=home:tel dom +TEL;TYPE=cell:portable +TEL;TYPE=fax:fax +TEL;TYPE=pager:pager +X-MOZILLA-HTML:FALSE +EMAIL;TYPE=work:address.email@domaine.ca +EMAIL;TYPE=home:address.email@domaine2.com +URL;TYPE=home:web perso +TITLE:fonction +URL;TYPE=work:page soc +CUSTOM1:divers1 +CUSTOM2:divers2 +CUSTOM3:divers3 +CUSTOM4:divers4 +NOTE:Remarque +X-AIM:pseudo aim +END:VCARD`, + 'new-modified.vcf': `BEGIN:VCARD +VERSION:3.0 +PRODID:-//Inverse//Card Generator//EN +UID:NEWTESTCARD +N:New;Carte modifiee +FN:Carte modifiee 'new' +ORG:societe;service +NICKNAME:surnom +ADR;TYPE=work:adr2 societe;;adr societe;ville societe;etat soc;code soc;pays soc +ADR;TYPE=home:rue perso 2;;rue perso;ville perso;etat perso;code post perso;pays perso +TEL;TYPE=work:+1 514 123-3372 +TEL;TYPE=home:tel dom +TEL;TYPE=cell:portable +TEL;TYPE=fax:fax +TEL;TYPE=pager:pager +X-MOZILLA-HTML:FALSE +EMAIL;TYPE=work:address.email@domaine.ca +EMAIL;TYPE=home:address.email@domaine2.com +URL;TYPE=home:web perso +TITLE:fonction +URL;TYPE=work:page soc +CUSTOM1:divers1 +CUSTOM2:divers2 +CUSTOM3:divers3 +CUSTOM4:divers4 +NOTE:Remarque +X-AIM:pseudo aim +END:VCARD` +} + +describe('CardDAV extensions', function() { + const webdav = new WebDAV(config.username, config.password) + const webdav_su = new WebDAV(config.superuser, config.superuser_password) + const utility = new TestUtility(webdav) + + const resource = `/SOGo/dav/${config.username}/Contacts/test-carddav/` + + const _putCard = async function(client, filename, expectedCode, realCard) { + const card = cards[realCard || filename] + if (!card) + throw new Error(`Card ${realCard || filename} is unknown`) + const response = await client.createVCard(resource, filename, card) + expect(response.status).toBe(expectedCode) + } + + beforeAll(async function() { + await webdav.deleteObject(resource) + await webdav.makeCollection(resource) + for (let key of Object.keys(cards)) { + await _putCard(webdav, key, 201) + } + }) + + afterAll(async function() { + await webdav_su.deleteObject(resource) + }) + + // https://datatracker.ietf.org/doc/html/rfc6352#section-8.7 + fit("supports for addressbook-multiget", async function() { + const hrefs = Object.keys(cards).map(c => `${resource}${c}`) + const response = await davRequest({ + url: webdav.serverUrl + resource, + init: { + method: 'REPORT', + namespace: DAVNamespaceShorthandMap[DAVNamespace.CARDDAV], + headers: { ...webdav.headers, depth: '0' }, + body: { + 'addressbook-multiget': { + _attributes: getDAVAttribute([ + DAVNamespace.CARDDAV, + DAVNamespace.DAV + ]), + [`${DAVNamespaceShorthandMap[DAVNamespace.DAV]}:prop`]: formatProps([{ name: 'address-data', namespace: DAVNamespace.CARDDAV }]), + [`${DAVNamespaceShorthandMap[DAVNamespace.DAV]}:href`]: hrefs + } + } + }, + }) + expect(response.length).toBe(2) + for (let r of response) { + const [name, ...rest] = r.href.split('/').reverse() + expect(r.status) + .withContext(`HTTP status code of addressbook-multiget`) + .toEqual(207) + expect(utility.componentsAreEqual(r.props.addressData, cards[name])) + .withContext(`Cards returned in addressbook-multiget`) + .toBe(true) + } + }) +}) \ No newline at end of file diff --git a/Tests/spec/DAVAddressBookAclSpec.js b/Tests/spec/DAVAddressBookAclSpec.js index 51e91d828..65b09fc9c 100644 --- a/Tests/spec/DAVAddressBookAclSpec.js +++ b/Tests/spec/DAVAddressBookAclSpec.js @@ -198,7 +198,7 @@ END:VCARD` beforeEach(async function() { await webdav.deleteObject(resource) - await webdav.makeAddressBook(resource) + await webdav.makeCollection(resource) await _putCard(webdav, 'old.vcf', 201) }) diff --git a/Tests/spec/DAVCalendarAclSpec.js b/Tests/spec/DAVCalendarAclSpec.js index 070b4e63e..5edfd11eb 100644 --- a/Tests/spec/DAVCalendarAclSpec.js +++ b/Tests/spec/DAVCalendarAclSpec.js @@ -98,7 +98,7 @@ END:VCALENDAR` const _getEvent = async function(eventClass, isInvitation = false) { const iscClass = classToICSClass[eventClass].toLowerCase() const filename = (isInvitation ? `invitation-${iscClass}` : iscClass) + '-event.ics' - const [{ status, raw = '' }] = await webdav_subscriber.getEvent(resource, filename) + const [{ status, raw = '' }] = await webdav_subscriber.getObject(resource, filename) if (status == 200) return raw.replace(/\r\n/g,'\n') @@ -303,7 +303,7 @@ END:VCALENDAR` }) } const event = await _getEvent(eventClass, true) - expect(utility.calendarsAreEqual(expectedEvent, event)) + expect(utility.componentsAreEqual(expectedEvent, event)) .withContext('Calendars of organizer and attendee are identical') .toBe(true) } diff --git a/Tests/spec/DAVCalendarSuperUserAclSpec.js b/Tests/spec/DAVCalendarSuperUserAclSpec.js index 4672e79de..9c0734680 100644 --- a/Tests/spec/DAVCalendarSuperUserAclSpec.js +++ b/Tests/spec/DAVCalendarSuperUserAclSpec.js @@ -55,7 +55,7 @@ END:VCALENDAR` // 2. Read - GET - results = await webdav_su.getEvent(resource, filename) + results = await webdav_su.getObject(resource, filename) expect(results.length).toBe(1) expect(results[0].raw.replace(/\r\n/g,'\n')).toBe(event)