Skip to content

Commit

Permalink
Add License model
Browse files Browse the repository at this point in the history
Common `License` class which could be used by all apps to check if user has accepted SLUL
  • Loading branch information
pondzix committed Mar 11, 2024
1 parent 6cdcbac commit d3223fa
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright (c) 2023-present Snowplow Analytics Ltd. All rights reserved.
*
* This program is licensed to you under the Snowplow Community License Version 1.0,
* and you may not use this file except in compliance with the Snowplow Community License Version 1.0.
* You may obtain a copy of the Snowplow Community License Version 1.0 at https://docs.snowplow.io/community-license-1.0
*/
package com.snowplowanalytics.snowplow.runtime

import io.circe.Decoder

final case class AcceptedLicense()

object AcceptedLicense {
final case class DocumentationLink(value: String)

def decoder(documentationLink: DocumentationLink): Decoder[AcceptedLicense] = {
val truthy = Set("true", "yes", "on", "1")
Decoder
.forProduct1("accept")((s: String) => truthy(s.toLowerCase()))
.or(Decoder.forProduct1("accept")((b: Boolean) => b))
.emap {
case false =>
Left(
s"Please accept the terms of the Snowplow Limited Use License Agreement to proceed. See ${documentationLink.value} for more information on the license and how to configure this."
)
case _ =>
Right(AcceptedLicense())
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright (c) 2023-present Snowplow Analytics Ltd. All rights reserved.
*
* This program is licensed to you under the Snowplow Community License Version 1.0,
* and you may not use this file except in compliance with the Snowplow Community License Version 1.0.
* You may obtain a copy of the Snowplow Community License Version 1.0 at https://docs.snowplow.io/community-license-1.0
*/
package com.snowplowanalytics.snowplow.runtime

import cats.effect.testing.specs2.CatsEffect
import io.circe.literal.JsonStringContext
import io.circe.{Decoder, DecodingFailure}
import org.specs2.Specification

class LicenseSpec extends Specification with CatsEffect {

implicit val decoder: Decoder[AcceptedLicense] =
AcceptedLicense.decoder(AcceptedLicense.DocumentationLink("https://test.license.doc"))

private val expectedErrorMessage =
"DecodingFailure at : Please accept the terms of the Snowplow Limited Use License Agreement to proceed. See https://test.license.doc for more information on the license and how to configure this."

def is = s2"""
Decoding license should be successful for:
boolean true $e1
string "true" $e2
string "yes" $e3
string "on" $e4
string "1" $e5
Decoding license should not be successful for:
boolean false $e6
string "false" $e7
any 'non-truthy' string like "something" $e8
"""

def e1 =
json"""{"accept": true}""".as[AcceptedLicense] must beRight(AcceptedLicense())

def e2 =
json"""{"accept": "true"}""".as[AcceptedLicense] must beRight(AcceptedLicense())

def e3 =
json"""{"accept": "yes"}""".as[AcceptedLicense] must beRight(AcceptedLicense())

def e4 =
json"""{"accept": "on"}""".as[AcceptedLicense] must beRight(AcceptedLicense())

def e5 =
json"""{"accept": "1"}""".as[AcceptedLicense] must beRight(AcceptedLicense())

def e6 =
json"""{"accept": false}""".as[AcceptedLicense] must beLeft.like { case er: DecodingFailure =>
er.getMessage must beEqualTo(expectedErrorMessage)
}

def e7 =
json"""{"accept": "false"}""".as[AcceptedLicense] must beLeft.like { case er: DecodingFailure =>
er.getMessage must beEqualTo(expectedErrorMessage)
}

def e8 =
json"""{"accept": "something"}""".as[AcceptedLicense] must beLeft.like { case er: DecodingFailure =>
er.getMessage must beEqualTo(expectedErrorMessage)
}
}

0 comments on commit d3223fa

Please sign in to comment.