mirror of
https://github.com/lennart-k/rustical.git
synced 2025-12-23 11:29:32 +00:00
Compare commits
3 Commits
a45e0b2efd
...
4b4210b4d7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b4210b4d7 | ||
|
|
8fadff1b57 | ||
|
|
61a8c32af4 |
3
Cargo.lock
generated
3
Cargo.lock
generated
@@ -3069,6 +3069,7 @@ dependencies = [
|
|||||||
"figment",
|
"figment",
|
||||||
"headers",
|
"headers",
|
||||||
"http",
|
"http",
|
||||||
|
"insta",
|
||||||
"opentelemetry",
|
"opentelemetry",
|
||||||
"opentelemetry-otlp",
|
"opentelemetry-otlp",
|
||||||
"opentelemetry-semantic-conventions",
|
"opentelemetry-semantic-conventions",
|
||||||
@@ -3078,6 +3079,7 @@ dependencies = [
|
|||||||
"quick-xml",
|
"quick-xml",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"rpassword",
|
"rpassword",
|
||||||
|
"rstest",
|
||||||
"rustical_caldav",
|
"rustical_caldav",
|
||||||
"rustical_carddav",
|
"rustical_carddav",
|
||||||
"rustical_dav",
|
"rustical_dav",
|
||||||
@@ -3115,6 +3117,7 @@ dependencies = [
|
|||||||
"headers",
|
"headers",
|
||||||
"http",
|
"http",
|
||||||
"ical",
|
"ical",
|
||||||
|
"insta",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"quick-xml",
|
"quick-xml",
|
||||||
"rstest",
|
"rstest",
|
||||||
|
|||||||
@@ -151,6 +151,11 @@ async-std = { version = "1.13", features = ["attributes"] }
|
|||||||
similar-asserts = "1.7"
|
similar-asserts = "1.7"
|
||||||
insta = "1.44"
|
insta = "1.44"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
rstest.workspace = true
|
||||||
|
rustical_store_sqlite = { workspace = true, features = ["test"] }
|
||||||
|
insta.workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rustical_store.workspace = true
|
rustical_store.workspace = true
|
||||||
rustical_store_sqlite.workspace = true
|
rustical_store_sqlite.workspace = true
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ rustical_store_sqlite = { workspace = true, features = ["test"] }
|
|||||||
rstest.workspace = true
|
rstest.workspace = true
|
||||||
async-std.workspace = true
|
async-std.workspace = true
|
||||||
serde_json.workspace = true
|
serde_json.workspace = true
|
||||||
|
insta.workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
axum.workspace = true
|
axum.workspace = true
|
||||||
|
|||||||
@@ -0,0 +1,136 @@
|
|||||||
|
---
|
||||||
|
source: crates/caldav/src/principal/tests.rs
|
||||||
|
expression: response
|
||||||
|
---
|
||||||
|
ResponseElement {
|
||||||
|
href: "/caldav/principal/user/",
|
||||||
|
status: None,
|
||||||
|
propstat: [
|
||||||
|
Normal(
|
||||||
|
PropstatElement {
|
||||||
|
prop: PropTagWrapper(
|
||||||
|
[
|
||||||
|
Principal(
|
||||||
|
CalendarUserType(
|
||||||
|
Individual,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Principal(
|
||||||
|
CalendarUserAddressSet(
|
||||||
|
HrefElement {
|
||||||
|
href: "/caldav/principal/user/",
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Principal(
|
||||||
|
PrincipalUrl(
|
||||||
|
HrefElement {
|
||||||
|
href: "/caldav/principal/user/",
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Principal(
|
||||||
|
GroupMembership(
|
||||||
|
GroupMembership(
|
||||||
|
[
|
||||||
|
HrefElement {
|
||||||
|
href: "/caldav/principal/group/",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Principal(
|
||||||
|
GroupMemberSet(
|
||||||
|
GroupMemberSet(
|
||||||
|
[],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Principal(
|
||||||
|
AlternateUriSet,
|
||||||
|
),
|
||||||
|
Principal(
|
||||||
|
SupportedReportSet(
|
||||||
|
SupportedReportSet {
|
||||||
|
supported_report: [
|
||||||
|
ReportWrapper {
|
||||||
|
report: PrincipalMatch,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Principal(
|
||||||
|
CalendarHomeSet(
|
||||||
|
CalendarHomeSet(
|
||||||
|
[
|
||||||
|
HrefElement {
|
||||||
|
href: "/caldav/principal/group/",
|
||||||
|
},
|
||||||
|
HrefElement {
|
||||||
|
href: "/caldav/principal/user/",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Common(
|
||||||
|
Resourcetype(
|
||||||
|
Resourcetype(
|
||||||
|
[
|
||||||
|
ResourcetypeInner(
|
||||||
|
Some(
|
||||||
|
Namespace("DAV:"),
|
||||||
|
),
|
||||||
|
"collection",
|
||||||
|
),
|
||||||
|
ResourcetypeInner(
|
||||||
|
Some(
|
||||||
|
Namespace("DAV:"),
|
||||||
|
),
|
||||||
|
"principal",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Common(
|
||||||
|
Displayname(
|
||||||
|
Some(
|
||||||
|
"user",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Common(
|
||||||
|
CurrentUserPrincipal(
|
||||||
|
HrefElement {
|
||||||
|
href: "/caldav/principal/user/",
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Common(
|
||||||
|
CurrentUserPrivilegeSet(
|
||||||
|
UserPrivilegeSet {
|
||||||
|
privileges: {
|
||||||
|
All,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Common(
|
||||||
|
Owner(
|
||||||
|
Some(
|
||||||
|
HrefElement {
|
||||||
|
href: "/caldav/principal/user/",
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
status: 200,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
---
|
||||||
|
source: crates/caldav/src/principal/tests.rs
|
||||||
|
expression: response.serialize_to_string().unwrap()
|
||||||
|
---
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<response xmlns="DAV:" xmlns:CAL="urn:ietf:params:xml:ns:caldav" xmlns:CARD="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/" xmlns:PUSH="https://bitfire.at/webdav-push">
|
||||||
|
<href>/caldav/principal/user/</href>
|
||||||
|
<propstat>
|
||||||
|
<prop>
|
||||||
|
<CAL:calendar-user-type>INDIVIDUAL</CAL:calendar-user-type>
|
||||||
|
<CAL:calendar-user-address-set>
|
||||||
|
<href>/caldav/principal/user/</href>
|
||||||
|
</CAL:calendar-user-address-set>
|
||||||
|
<principal-URL>
|
||||||
|
<href>/caldav/principal/user/</href>
|
||||||
|
</principal-URL>
|
||||||
|
<group-membership>
|
||||||
|
<href>/caldav/principal/group/</href>
|
||||||
|
</group-membership>
|
||||||
|
<group-member-set>
|
||||||
|
</group-member-set>
|
||||||
|
<alternate-URI-set/>
|
||||||
|
<supported-report-set>
|
||||||
|
<supported-report>
|
||||||
|
<report>
|
||||||
|
<principal-match/>
|
||||||
|
</report>
|
||||||
|
</supported-report>
|
||||||
|
</supported-report-set>
|
||||||
|
<CAL:calendar-home-set>
|
||||||
|
<href>/caldav/principal/group/</href>
|
||||||
|
<href>/caldav/principal/user/</href>
|
||||||
|
</CAL:calendar-home-set>
|
||||||
|
<resourcetype>
|
||||||
|
<collection/>
|
||||||
|
<principal/>
|
||||||
|
</resourcetype>
|
||||||
|
<displayname>user</displayname>
|
||||||
|
<current-user-principal>
|
||||||
|
<href>/caldav/principal/user/</href>
|
||||||
|
</current-user-principal>
|
||||||
|
<current-user-privilege-set>
|
||||||
|
<privilege>
|
||||||
|
<all/>
|
||||||
|
</privilege>
|
||||||
|
</current-user-privilege-set>
|
||||||
|
<owner>
|
||||||
|
<href>/caldav/principal/user/</href>
|
||||||
|
</owner>
|
||||||
|
</prop>
|
||||||
|
<status>HTTP/1.1 200 OK</status>
|
||||||
|
</propstat>
|
||||||
|
</response>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: crates/caldav/src/principal/tests.rs
|
||||||
|
expression: propfind
|
||||||
|
---
|
||||||
|
PropfindElement {
|
||||||
|
prop: Allprop,
|
||||||
|
include: None,
|
||||||
|
}
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
CalDavPrincipalUri,
|
CalDavPrincipalUri,
|
||||||
principal::{PrincipalResource, PrincipalResourceService},
|
principal::{PrincipalResource, PrincipalResourceService},
|
||||||
@@ -14,6 +12,7 @@ use rustical_store_sqlite::{
|
|||||||
tests::{get_test_calendar_store, get_test_principal_store, get_test_subscription_store},
|
tests::{get_test_calendar_store, get_test_principal_store, get_test_subscription_store},
|
||||||
};
|
};
|
||||||
use rustical_xml::XmlSerializeRoot;
|
use rustical_xml::XmlSerializeRoot;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
#[rstest]
|
#[rstest]
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
@@ -64,6 +63,8 @@ async fn test_propfind() {
|
|||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
insta::assert_debug_snapshot!(propfind);
|
||||||
|
|
||||||
let principal = Principal {
|
let principal = Principal {
|
||||||
id: "user".to_string(),
|
id: "user".to_string(),
|
||||||
displayname: None,
|
displayname: None,
|
||||||
@@ -88,5 +89,6 @@ async fn test_propfind() {
|
|||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let _output = response.serialize_to_string().unwrap();
|
insta::assert_debug_snapshot!(response);
|
||||||
|
insta::assert_snapshot!(response.serialize_to_string().unwrap());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,3 +3,5 @@ pub mod prop;
|
|||||||
pub mod resource;
|
pub mod resource;
|
||||||
mod service;
|
mod service;
|
||||||
pub use service::*;
|
pub use service::*;
|
||||||
|
#[cfg(test)]
|
||||||
|
pub mod tests;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use rustical_dav_push::DavPushExtensionProp;
|
|||||||
use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize};
|
use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize};
|
||||||
use strum_macros::VariantArray;
|
use strum_macros::VariantArray;
|
||||||
|
|
||||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, EnumVariants, PropName)]
|
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, EnumVariants, PropName, Debug)]
|
||||||
#[xml(unit_variants_ident = "AddressbookPropName")]
|
#[xml(unit_variants_ident = "AddressbookPropName")]
|
||||||
pub enum AddressbookProp {
|
pub enum AddressbookProp {
|
||||||
// CardDAV (RFC 6352)
|
// CardDAV (RFC 6352)
|
||||||
@@ -20,7 +20,7 @@ pub enum AddressbookProp {
|
|||||||
MaxResourceSize(i64),
|
MaxResourceSize(i64),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, EnumVariants, PropName)]
|
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, EnumVariants, PropName, Debug)]
|
||||||
#[xml(unit_variants_ident = "AddressbookPropWrapperName", untagged)]
|
#[xml(unit_variants_ident = "AddressbookPropWrapperName", untagged)]
|
||||||
pub enum AddressbookPropWrapper {
|
pub enum AddressbookPropWrapper {
|
||||||
Addressbook(AddressbookProp),
|
Addressbook(AddressbookProp),
|
||||||
|
|||||||
@@ -0,0 +1,151 @@
|
|||||||
|
---
|
||||||
|
source: crates/carddav/src/addressbook/tests.rs
|
||||||
|
expression: response
|
||||||
|
---
|
||||||
|
ResponseElement {
|
||||||
|
href: "/carddav/principal/user/yeet/",
|
||||||
|
status: None,
|
||||||
|
propstat: [
|
||||||
|
Normal(
|
||||||
|
PropstatElement {
|
||||||
|
prop: PropTagWrapper(
|
||||||
|
[
|
||||||
|
Addressbook(
|
||||||
|
AddressbookDescription(
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Addressbook(
|
||||||
|
SupportedAddressData(
|
||||||
|
SupportedAddressData {
|
||||||
|
address_data_type: [
|
||||||
|
AddressDataType {
|
||||||
|
content_type: "text/vcard",
|
||||||
|
version: "3.0",
|
||||||
|
},
|
||||||
|
AddressDataType {
|
||||||
|
content_type: "text/vcard",
|
||||||
|
version: "4.0",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Addressbook(
|
||||||
|
SupportedReportSet(
|
||||||
|
SupportedReportSet {
|
||||||
|
supported_report: [
|
||||||
|
ReportWrapper {
|
||||||
|
report: AddressbookMultiget,
|
||||||
|
},
|
||||||
|
ReportWrapper {
|
||||||
|
report: SyncCollection,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Addressbook(
|
||||||
|
MaxResourceSize(
|
||||||
|
10000000,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SyncToken(
|
||||||
|
SyncToken(
|
||||||
|
"github.com/lennart-k/rustical/ns/0",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SyncToken(
|
||||||
|
Getctag(
|
||||||
|
"github.com/lennart-k/rustical/ns/0",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
DavPush(
|
||||||
|
Transports(
|
||||||
|
Transports {
|
||||||
|
transports: [
|
||||||
|
WebPush,
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
DavPush(
|
||||||
|
Topic(
|
||||||
|
"asdasd",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
DavPush(
|
||||||
|
SupportedTriggers(
|
||||||
|
SupportedTriggers(
|
||||||
|
[
|
||||||
|
ContentUpdate(
|
||||||
|
ContentUpdate(
|
||||||
|
One,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PropertyUpdate(
|
||||||
|
PropertyUpdate(
|
||||||
|
One,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Common(
|
||||||
|
Resourcetype(
|
||||||
|
Resourcetype(
|
||||||
|
[
|
||||||
|
ResourcetypeInner(
|
||||||
|
Some(
|
||||||
|
Namespace("DAV:"),
|
||||||
|
),
|
||||||
|
"collection",
|
||||||
|
),
|
||||||
|
ResourcetypeInner(
|
||||||
|
Some(
|
||||||
|
Namespace("urn:ietf:params:xml:ns:carddav"),
|
||||||
|
),
|
||||||
|
"addressbook",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Common(
|
||||||
|
Displayname(
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Common(
|
||||||
|
CurrentUserPrincipal(
|
||||||
|
HrefElement {
|
||||||
|
href: "/carddav/principal/user/",
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Common(
|
||||||
|
CurrentUserPrivilegeSet(
|
||||||
|
UserPrivilegeSet {
|
||||||
|
privileges: {
|
||||||
|
All,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Common(
|
||||||
|
Owner(
|
||||||
|
Some(
|
||||||
|
HrefElement {
|
||||||
|
href: "/carddav/principal/user/",
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
status: 200,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
---
|
||||||
|
source: crates/carddav/src/addressbook/tests.rs
|
||||||
|
expression: response.serialize_to_string().unwrap()
|
||||||
|
---
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<response xmlns="DAV:" xmlns:CAL="urn:ietf:params:xml:ns:caldav" xmlns:CARD="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/" xmlns:PUSH="https://bitfire.at/webdav-push">
|
||||||
|
<href>/carddav/principal/user/yeet/</href>
|
||||||
|
<propstat>
|
||||||
|
<prop>
|
||||||
|
<CARD:supported-address-data>
|
||||||
|
<CARD:address-data-type content-type="text/vcard" version="3.0"/>
|
||||||
|
<CARD:address-data-type content-type="text/vcard" version="4.0"/>
|
||||||
|
</CARD:supported-address-data>
|
||||||
|
<supported-report-set>
|
||||||
|
<supported-report>
|
||||||
|
<report>
|
||||||
|
<CARD:addressbook-multiget/>
|
||||||
|
</report>
|
||||||
|
</supported-report>
|
||||||
|
<supported-report>
|
||||||
|
<report>
|
||||||
|
<sync-collection/>
|
||||||
|
</report>
|
||||||
|
</supported-report>
|
||||||
|
</supported-report-set>
|
||||||
|
<max-resource-size>10000000</max-resource-size>
|
||||||
|
<sync-token>github.com/lennart-k/rustical/ns/0</sync-token>
|
||||||
|
<CS:getctag>github.com/lennart-k/rustical/ns/0</CS:getctag>
|
||||||
|
<PUSH:transports>
|
||||||
|
<PUSH:web-push/>
|
||||||
|
</PUSH:transports>
|
||||||
|
<PUSH:topic>asdasd</PUSH:topic>
|
||||||
|
<PUSH:supported-triggers>
|
||||||
|
<PUSH:content-update>
|
||||||
|
<depth>1</depth>
|
||||||
|
</PUSH:content-update>
|
||||||
|
<PUSH:property-update>
|
||||||
|
<depth>1</depth>
|
||||||
|
</PUSH:property-update>
|
||||||
|
</PUSH:supported-triggers>
|
||||||
|
<resourcetype>
|
||||||
|
<collection/>
|
||||||
|
<CARD:addressbook/>
|
||||||
|
</resourcetype>
|
||||||
|
<current-user-principal>
|
||||||
|
<href>/carddav/principal/user/</href>
|
||||||
|
</current-user-principal>
|
||||||
|
<current-user-privilege-set>
|
||||||
|
<privilege>
|
||||||
|
<all/>
|
||||||
|
</privilege>
|
||||||
|
</current-user-privilege-set>
|
||||||
|
<owner>
|
||||||
|
<href>/carddav/principal/user/</href>
|
||||||
|
</owner>
|
||||||
|
</prop>
|
||||||
|
<status>HTTP/1.1 200 OK</status>
|
||||||
|
</propstat>
|
||||||
|
</response>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: crates/carddav/src/addressbook/tests.rs
|
||||||
|
expression: propfind
|
||||||
|
---
|
||||||
|
PropfindElement {
|
||||||
|
prop: Allprop,
|
||||||
|
include: None,
|
||||||
|
}
|
||||||
49
crates/carddav/src/addressbook/tests.rs
Normal file
49
crates/carddav/src/addressbook/tests.rs
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
use crate::{CardDavPrincipalUri, addressbook::resource::AddressbookResource};
|
||||||
|
use rustical_dav::resource::Resource;
|
||||||
|
use rustical_store::{Addressbook, auth::Principal};
|
||||||
|
use rustical_xml::XmlSerializeRoot;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_propfind() {
|
||||||
|
let propfind = AddressbookResource::parse_propfind(
|
||||||
|
r#"<?xml version="1.0" encoding="UTF-8"?><propfind xmlns="DAV:"><allprop/></propfind>"#,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
insta::assert_debug_snapshot!(propfind);
|
||||||
|
|
||||||
|
let principal = Principal {
|
||||||
|
id: "user".to_string(),
|
||||||
|
displayname: None,
|
||||||
|
principal_type: rustical_store::auth::PrincipalType::Individual,
|
||||||
|
password: None,
|
||||||
|
memberships: vec!["group".to_string()],
|
||||||
|
};
|
||||||
|
|
||||||
|
let addressbook = Addressbook {
|
||||||
|
id: "yeet".to_string(),
|
||||||
|
principal: "user".to_string(),
|
||||||
|
displayname: None,
|
||||||
|
description: None,
|
||||||
|
deleted_at: None,
|
||||||
|
synctoken: 0,
|
||||||
|
push_topic: "asdasd".to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let resource = AddressbookResource(addressbook.clone());
|
||||||
|
let response = resource
|
||||||
|
.propfind(
|
||||||
|
&format!(
|
||||||
|
"/carddav/principal/{}/{}",
|
||||||
|
addressbook.principal, addressbook.id
|
||||||
|
),
|
||||||
|
&propfind.prop,
|
||||||
|
propfind.include.as_ref(),
|
||||||
|
&CardDavPrincipalUri("/carddav"),
|
||||||
|
&principal,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
insta::assert_debug_snapshot!(response);
|
||||||
|
insta::assert_snapshot!(response.serialize_to_string().unwrap());
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize};
|
use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize};
|
||||||
|
|
||||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, PropName, EnumVariants)]
|
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, PropName, EnumVariants, Debug)]
|
||||||
#[xml(unit_variants_ident = "SyncTokenExtensionPropName")]
|
#[xml(unit_variants_ident = "SyncTokenExtensionPropName")]
|
||||||
pub enum SyncTokenExtensionProp {
|
pub enum SyncTokenExtensionProp {
|
||||||
// Collection Synchronization (RFC 6578)
|
// Collection Synchronization (RFC 6578)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use crate::{ContentUpdate, PropertyUpdate, SupportedTriggers, Transports, Trigge
|
|||||||
use rustical_dav::header::Depth;
|
use rustical_dav::header::Depth;
|
||||||
use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize};
|
use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize};
|
||||||
|
|
||||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, PropName, EnumVariants)]
|
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, PropName, EnumVariants, Debug)]
|
||||||
#[xml(unit_variants_ident = "DavPushExtensionPropName")]
|
#[xml(unit_variants_ident = "DavPushExtensionPropName")]
|
||||||
pub enum DavPushExtensionProp {
|
pub enum DavPushExtensionProp {
|
||||||
// WebDav Push
|
// WebDav Push
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ impl Default for Transports {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(XmlSerialize, XmlDeserialize, PartialEq, Eq, Clone)]
|
#[derive(XmlSerialize, XmlDeserialize, PartialEq, Eq, Clone, Debug)]
|
||||||
pub struct SupportedTriggers(#[xml(flatten, ty = "untagged")] pub Vec<Trigger>);
|
pub struct SupportedTriggers(#[xml(flatten, ty = "untagged")] pub Vec<Trigger>);
|
||||||
|
|
||||||
#[derive(XmlSerialize, XmlDeserialize, PartialEq, Eq, Debug, Clone)]
|
#[derive(XmlSerialize, XmlDeserialize, PartialEq, Eq, Debug, Clone)]
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ mod app;
|
|||||||
mod commands;
|
mod commands;
|
||||||
mod config;
|
mod config;
|
||||||
mod setup_tracing;
|
mod setup_tracing;
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests;
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
#[command(author, version, about, long_about = None)]
|
#[command(author, version, about, long_about = None)]
|
||||||
|
|||||||
52
src/tests.rs
Normal file
52
src/tests.rs
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
use crate::{app::make_app, config::NextcloudLoginConfig};
|
||||||
|
use rstest::rstest;
|
||||||
|
use rustical_frontend::FrontendConfig;
|
||||||
|
use rustical_store_sqlite::{
|
||||||
|
SqliteStore,
|
||||||
|
addressbook_store::SqliteAddressbookStore,
|
||||||
|
calendar_store::SqliteCalendarStore,
|
||||||
|
principal_store::SqlitePrincipalStore,
|
||||||
|
tests::{
|
||||||
|
get_test_addressbook_store, get_test_calendar_store, get_test_principal_store,
|
||||||
|
get_test_subscription_store,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
#[rstest]
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_app(
|
||||||
|
#[from(get_test_calendar_store)]
|
||||||
|
#[future]
|
||||||
|
cal_store: SqliteCalendarStore,
|
||||||
|
#[from(get_test_addressbook_store)]
|
||||||
|
#[future]
|
||||||
|
addr_store: SqliteAddressbookStore,
|
||||||
|
#[from(get_test_principal_store)]
|
||||||
|
#[future]
|
||||||
|
principal_store: SqlitePrincipalStore,
|
||||||
|
#[from(get_test_subscription_store)]
|
||||||
|
#[future]
|
||||||
|
sub_store: SqliteStore,
|
||||||
|
) {
|
||||||
|
let addr_store = Arc::new(addr_store.await);
|
||||||
|
let cal_store = Arc::new(cal_store.await);
|
||||||
|
let sub_store = Arc::new(sub_store.await);
|
||||||
|
let principal_store = Arc::new(principal_store.await);
|
||||||
|
|
||||||
|
let _app = make_app(
|
||||||
|
addr_store,
|
||||||
|
cal_store,
|
||||||
|
sub_store,
|
||||||
|
principal_store,
|
||||||
|
FrontendConfig {
|
||||||
|
enabled: true,
|
||||||
|
allow_password_login: true,
|
||||||
|
},
|
||||||
|
None,
|
||||||
|
&NextcloudLoginConfig { enabled: false },
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
20,
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user