16
16
17
17
package fr .acinq .eclair .api
18
18
19
+ import java .util .UUID
20
+
19
21
import akka .actor .{ActorRef , ActorSystem }
20
22
import akka .http .scaladsl .model .FormData
21
23
import akka .http .scaladsl .model .StatusCodes ._
22
24
import akka .http .scaladsl .model .headers .BasicHttpCredentials
23
25
import akka .http .scaladsl .server .Route
24
26
import akka .http .scaladsl .testkit .{RouteTestTimeout , ScalatestRouteTest , WSProbe }
25
- import akka .stream .Materializer
26
27
import akka .util .Timeout
27
28
import de .heikoseeberger .akkahttpjson4s .Json4sSupport
28
29
import fr .acinq .bitcoin .Crypto .PublicKey
@@ -31,7 +32,7 @@ import fr.acinq.eclair.ApiTypes.ChannelIdentifier
31
32
import fr .acinq .eclair .FeatureSupport .{Mandatory , Optional }
32
33
import fr .acinq .eclair .Features .{ChannelRangeQueriesExtended , OptionDataLossProtect }
33
34
import fr .acinq .eclair ._
34
- import fr .acinq .eclair .api .directives .ErrorResponse
35
+ import fr .acinq .eclair .api .directives .{ EclairDirectives , ErrorResponse }
35
36
import fr .acinq .eclair .api .serde .JsonSupport
36
37
import fr .acinq .eclair .blockchain .fee .FeeratePerKw
37
38
import fr .acinq .eclair .channel .ChannelOpenResponse .ChannelOpened
@@ -52,7 +53,6 @@ import org.scalatest.funsuite.AnyFunSuite
52
53
import org .scalatest .matchers .should .Matchers
53
54
import scodec .bits ._
54
55
55
- import java .util .UUID
56
56
import scala .concurrent .Future
57
57
import scala .concurrent .duration ._
58
58
import scala .io .Source
@@ -68,13 +68,29 @@ class ApiServiceSpec extends AnyFunSuite with ScalatestRouteTest with IdiomaticM
68
68
val aliceNodeId = PublicKey (hex " 03af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d0 " )
69
69
val bobNodeId = PublicKey (hex " 039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a3585 " )
70
70
71
+ object PluginApi extends RouteProvider {
72
+ override def route (directives : EclairDirectives ): Route = {
73
+ import directives ._
74
+ val route1 = postRequest(" plugin-test" ) { implicit t =>
75
+ complete(" fine" )
76
+ }
77
+
78
+ val route2 = postRequest(" payinvoice" ) { implicit t =>
79
+ complete(" gets overridden by base API endpoint" )
80
+ }
81
+
82
+ route1 ~ route2
83
+ }
84
+ }
85
+
71
86
class MockService (eclair : Eclair ) extends Service {
72
87
override val eclairApi : Eclair = eclair
73
88
74
89
override def password : String = " mock"
75
90
76
91
override implicit val actorSystem : ActorSystem = system
77
- override implicit val mat : Materializer = materializer
92
+
93
+ val route : Route = finalRoutes(Seq (PluginApi .route(this )))
78
94
}
79
95
80
96
def mockApi (eclair : Eclair = mock[Eclair ]): MockService = {
@@ -170,6 +186,17 @@ class ApiServiceSpec extends AnyFunSuite with ScalatestRouteTest with IdiomaticM
170
186
}
171
187
}
172
188
189
+ test(" plugin injects its own route" ) {
190
+ Post (" /plugin-test" ) ~>
191
+ addCredentials(BasicHttpCredentials (" " , mockApi().password)) ~>
192
+ Route .seal(mockApi().route) ~>
193
+ check {
194
+ assert(handled)
195
+ assert(status == OK )
196
+ assert(entityAs[String ] == " fine" )
197
+ }
198
+ }
199
+
173
200
test(" 'usablebalances' asks relayer for current usable balances" ) {
174
201
val eclair = mock[Eclair ]
175
202
eclair.usableBalances()(any[Timeout ]) returns Future .successful(List (
0 commit comments