This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 059e0e5f53a5b99ee3b7b624f1937918cb995bab
Author: Benoit Tellier <[email protected]>
AuthorDate: Fri Oct 29 10:07:54 2021 +0700

    JAMES-3539 PushListener should set urgency
---
 .../james/jmap/pushsubscription/PushListener.scala | 14 +++++++-
 .../jmap/pushsubscription/PushListenerTest.scala   | 42 +++++++++++++++++++---
 2 files changed, 51 insertions(+), 5 deletions(-)

diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala
index 857cc64..6154d0f 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala
@@ -26,7 +26,7 @@ import 
org.apache.james.events.EventListener.ReactiveGroupEventListener
 import org.apache.james.events.{Event, Group}
 import org.apache.james.jmap.api.model.PushSubscription
 import org.apache.james.jmap.api.pushsubscription.PushSubscriptionRepository
-import org.apache.james.jmap.change.StateChangeEvent
+import org.apache.james.jmap.change.{EmailDeliveryTypeName, StateChangeEvent}
 import org.apache.james.jmap.core.StateChange
 import org.apache.james.jmap.json.PushSerializer
 import org.apache.james.util.ReactorUtils
@@ -62,6 +62,7 @@ class PushListener @Inject()(pushRepository: 
PushSubscriptionRepository,
 
   private def asPushRequest(stateChange: StateChange, pushSubscription: 
PushSubscription): PushRequest =
     PushRequest(ttl = PushTTL.MAX,
+      urgency = Some(urgency(stateChange)),
       contentCoding = pushSubscription.keys.map(_ => Aes128gcm),
       payload = asBytes(stateChange, pushSubscription))
 
@@ -71,4 +72,15 @@ class PushListener @Inject()(pushRepository: 
PushSubscriptionRepository,
       .map(keys => keys.encrypt(clearTextPayload))
       .getOrElse(clearTextPayload)
   }
+
+  private def urgency(stateChange: StateChange): PushUrgency =
+    if (stateChange.changes
+      .values
+      .flatMap(ts => ts.changes.keys)
+      .toList
+      .contains(EmailDeliveryTypeName)) {
+      High
+    } else {
+      Low
+    }
 }
diff --git 
a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala
 
b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala
index b7880eb..738de4d 100644
--- 
a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala
@@ -37,6 +37,7 @@ import org.apache.james.jmap.change.{EmailDeliveryTypeName, 
EmailTypeName, Mailb
 import org.apache.james.jmap.core.UuidState
 import org.apache.james.jmap.json.PushSerializer
 import 
org.apache.james.jmap.memory.pushsubscription.MemoryPushSubscriptionRepository
+import org.assertj.core.api.Assertions.assertThat
 import org.assertj.core.api.SoftAssertions
 import org.junit.jupiter.api.{BeforeEach, Test}
 import org.mockito.ArgumentMatchers.any
@@ -118,8 +119,6 @@ class PushListenerTest {
 
     SoftAssertions.assertSoftly(softly => {
       softly.assertThat(argumentCaptor.getValue.ttl).isEqualTo(PushTTL.MAX)
-      softly.assertThat(argumentCaptor.getValue.topic.toJava).isEmpty
-      softly.assertThat(argumentCaptor.getValue.urgency.toJava).isEmpty
       softly.assertThat(new String(argumentCaptor.getValue.payload, 
StandardCharsets.UTF_8))
         
.isEqualTo(s"""{"@type":"StateChange","changed":{"$bobAccountId":{"Email":"${state1.value.toString}"}}}""")
     })
@@ -144,14 +143,49 @@ class PushListenerTest {
 
     SoftAssertions.assertSoftly(softly => {
       softly.assertThat(argumentCaptor.getValue.ttl).isEqualTo(PushTTL.MAX)
-      softly.assertThat(argumentCaptor.getValue.topic.toJava).isEmpty
-      softly.assertThat(argumentCaptor.getValue.urgency.toJava).isEmpty
       softly.assertThat(new String(argumentCaptor.getValue.payload, 
StandardCharsets.UTF_8))
         
.isEqualTo(s"""{"@type":"StateChange","changed":{"$bobAccountId":{"Email":"${state1.value.toString}","Mailbox":"${state2.value.toString}"}}}""")
     })
   }
 
   @Test
+  def emailDeliveryUrgencyShouldBeHigh(): Unit = {
+    val id = SMono(pushSubscriptionRepository.save(bob, 
PushSubscriptionCreationRequest(
+      deviceClientId = DeviceClientId("junit"),
+      url = url,
+      types = Seq(EmailDeliveryTypeName, EmailTypeName)))).block().id
+    SMono(pushSubscriptionRepository.validateVerificationCode(bob, id)).block()
+
+    val state1 = UuidState(UUID.randomUUID())
+    val state2 = UuidState(UUID.randomUUID())
+    val state3 = UuidState(UUID.randomUUID())
+    SMono(testee.reactiveEvent(StateChangeEvent(EventId.random(), bob,
+      Map(EmailTypeName -> state1, MailboxTypeName -> state2, 
EmailDeliveryTypeName -> state3)))).block()
+
+    val argumentCaptor: ArgumentCaptor[PushRequest] = 
ArgumentCaptor.forClass(classOf[PushRequest])
+    verify(webPushClient).push(ArgumentMatchers.eq(url), 
argumentCaptor.capture())
+    assertThat(argumentCaptor.getValue.urgency.toJava).contains(High)
+  }
+
+  @Test
+  def nonEmailDeliveryUrgencyShouldBeLow(): Unit = {
+    val id = SMono(pushSubscriptionRepository.save(bob, 
PushSubscriptionCreationRequest(
+      deviceClientId = DeviceClientId("junit"),
+      url = url,
+      types = Seq(EmailDeliveryTypeName, EmailTypeName)))).block().id
+    SMono(pushSubscriptionRepository.validateVerificationCode(bob, id)).block()
+
+    val state1 = UuidState(UUID.randomUUID())
+    val state2 = UuidState(UUID.randomUUID())
+    SMono(testee.reactiveEvent(StateChangeEvent(EventId.random(), bob,
+      Map(EmailTypeName -> state1, MailboxTypeName -> state2)))).block()
+
+    val argumentCaptor: ArgumentCaptor[PushRequest] = 
ArgumentCaptor.forClass(classOf[PushRequest])
+    verify(webPushClient).push(ArgumentMatchers.eq(url), 
argumentCaptor.capture())
+    assertThat(argumentCaptor.getValue.urgency.toJava).contains(Low)
+  }
+
+  @Test
   def pushShouldEncryptMessages(): Unit = {
     val uaKeyPair = EllipticCurves.generateKeyPair(CurveType.NIST_P256)
     val uaPrivateKey: ECPrivateKey = 
uaKeyPair.getPrivate.asInstanceOf[ECPrivateKey]

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to