Skip to content

Commit

Permalink
#9 no longer write to the RRD when temperatures are sent to the server
Browse files Browse the repository at this point in the history
  • Loading branch information
tobyweston committed Feb 14, 2018
1 parent 7f209f8 commit c040152
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 53 deletions.
6 changes: 3 additions & 3 deletions src/main/scala/bad/robot/temperature/server/HttpServer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import java.time.Clock
import java.util.concurrent.Executors._
import java.util.concurrent.{CountDownLatch, ExecutorService}

import bad.robot.temperature.{ErrorOnTemperatureSpike, JsonToCsv}
import bad.robot.temperature.JsonToCsv
import bad.robot.temperature.ds18b20.{SensorFile, SensorReader}
import bad.robot.temperature.rrd.{Host, Rrd}
import bad.robot.temperature.rrd.Host
import bad.robot.temperature.task.TemperatureMachineThreadFactory
import cats.implicits._
//import org.http4s.implicits._
Expand Down Expand Up @@ -45,7 +45,7 @@ class HttpServer(port: Int, monitored: List[Host]) {

private def services(): HttpService[IO] = {
CORS(
TemperatureEndpoint(SensorReader(SensorFile.find()), ErrorOnTemperatureSpike(Rrd(monitored)))(Clock.systemDefaultZone) <+>
TemperatureEndpoint(SensorReader(SensorFile.find()))(Clock.systemDefaultZone) <+>
ConnectionsEndpoint(Clock.systemDefaultZone) <+>
LogEndpoint() <+>
ExportEndpoint(JsonFile.load, JsonToCsv.DefaultTimeFormatter) <+>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ object TemperatureEndpoint {

private val temperatures: TrieMap[Host, Measurement] = TrieMap()

def apply(sensors: TemperatureReader, writer: TemperatureWriter)(implicit clock: Clock) = HttpService[IO] {
def apply(sensors: TemperatureReader)(implicit clock: Clock) = HttpService[IO] {
case GET -> Root / "temperature" => {
sensors.read.toHttpResponse(temperatures => {
Ok(s"${temperatures.average.temperature.asCelsius}")
Expand All @@ -53,12 +53,9 @@ object TemperatureEndpoint {

case request @ PUT -> Root / "temperature" => {
request.decode[Measurement](measurement => {
val result = for {
_ <- writer.write(measurement)
_ <- ConnectionsEndpoint.update(measurement.host, request.headers.get(`X-Forwarded-For`))
} yield measurement
val result = ConnectionsEndpoint.update(measurement.host, request.headers.get(`X-Forwarded-For`))

result.toHttpResponse(measurement => {
result.toHttpResponse(_ => {
temperatures.put(measurement.host, measurement)
NoContent()
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class TemperatureEndpointTest extends Specification {
val request = Request[IO](GET, Uri.uri("/temperature"))
val clock = fixedClock()
val reader = stubReader(\/-(List(SensorReading("28-0002343fd", Temperature(56.34)))))
val service = TemperatureEndpoint(reader, UnexpectedWriter)(clock)
val service = TemperatureEndpoint(reader)(clock)
val response = service.orNotFound.run(request).unsafeRunSync

response.status must_== Ok
Expand All @@ -40,7 +40,7 @@ class TemperatureEndpointTest extends Specification {
SensorReading("28-0000d34c3", Temperature(25.344)),
SensorReading("28-0000d34c3", Temperature(23.364)),
SensorReading("28-0000d34c3", Temperature(21.213))
))), UnexpectedWriter)(clock)
))))(clock)
val response = service.orNotFound.run(request).unsafeRunSync

response.status must_== Ok
Expand All @@ -50,7 +50,7 @@ class TemperatureEndpointTest extends Specification {
"General Error reading temperatures" >> {
val request = Request[IO](GET, Uri.uri("/temperature"))
val clock = fixedClock()
val service = TemperatureEndpoint(stubReader(-\/(SensorError("An example error"))), UnexpectedWriter)(clock)
val service = TemperatureEndpoint(stubReader(-\/(SensorError("An example error"))))(clock)
val response = service.orNotFound.run(request).unsafeRunSync

response.status must_== InternalServerError
Expand All @@ -59,7 +59,7 @@ class TemperatureEndpointTest extends Specification {

"Put some temperature data" >> {
val clock = fixedClock()
val service = TemperatureEndpoint(stubReader(\/-(List())), stubWriter(\/-(Unit)))(clock)
val service = TemperatureEndpoint(stubReader(\/-(List())))(clock)
val measurement = """{
| "host" : {
| "name" : "localhost",
Expand All @@ -79,44 +79,9 @@ class TemperatureEndpointTest extends Specification {
response must haveStatus(NoContent)
}

"Putting sensor data to the writer" >> {
val body = """{
| "host" : {
| "name" : "localhost",
| "utcOffset" : null
| },
| "seconds" : 7000,
| "sensors" : [
| {
| "name" : "28-00000dfg34ca",
| "temperature" : {
| "celsius" : 31.1
| }
| },
| {
| "name" : "28-0000012d432b",
| "temperature" : {
| "celsius" : 32.8
| }
| }
| ]
|}""".stripMargin
val request = Request[IO](PUT, Uri(path = "temperature")).withBody(body).unsafeRunSync
var temperatures = List[Temperature]()
val clock = fixedClock()
val service = TemperatureEndpoint(stubReader(\/-(List())), new TemperatureWriter {
def write(measurement: Measurement) : \/[Error, Unit] = {
temperatures = measurement.temperatures.map(_.temperature)
\/-(Unit)
}
})(clock)
service.orNotFound.run(request).unsafeRunSync
temperatures must_== List(Temperature(31.1), Temperature(32.8))
}

"Bad json when writing sensor data" >> {
val clock = fixedClock()
val service = TemperatureEndpoint(stubReader(\/-(List())), stubWriter(\/-(Unit)))(clock)
val service = TemperatureEndpoint(stubReader(\/-(List())))(clock)
val request: Request[IO] = Put("bad json")
val response = service.orNotFound.run(request).unsafeRunSync
response must haveStatus(org.http4s.Status.BadRequest)
Expand Down Expand Up @@ -170,7 +135,7 @@ class TemperatureEndpointTest extends Specification {


val clock = fixedClock(Instant.ofEpochSecond(200))
val service = TemperatureEndpoint(stubReader(\/-(List())), stubWriter(\/-(Unit)))(clock)
val service = TemperatureEndpoint(stubReader(\/-(List())))(clock)
service.orNotFound.run(Request[IO](DELETE, Uri.uri("/temperatures"))).unsafeRunSync
service.orNotFound.run(Put(measurement1)).unsafeRunSync
service.orNotFound.run(Put(measurement2)).unsafeRunSync
Expand Down Expand Up @@ -277,7 +242,7 @@ class TemperatureEndpointTest extends Specification {


val clock = fixedClock(Instant.ofEpochSecond(200))
val service = TemperatureEndpoint(stubReader(\/-(List())), stubWriter(\/-(Unit)))(clock)
val service = TemperatureEndpoint(stubReader(\/-(List())))(clock)
service.orNotFound.run(Request[IO](DELETE, Uri.uri("/temperatures"))).unsafeRunSync
service.orNotFound.run(Put(measurement1)).unsafeRunSync
service.orNotFound.run(Put(measurement2)).unsafeRunSync
Expand Down Expand Up @@ -370,7 +335,7 @@ class TemperatureEndpointTest extends Specification {


val clock = fixedClock(Instant.ofEpochSecond(300))
val service = TemperatureEndpoint(stubReader(\/-(List())), stubWriter(\/-(Unit)))(clock)
val service = TemperatureEndpoint(stubReader(\/-(List())))(clock)
service.orNotFound.run(Request[IO](DELETE, Uri.uri("/temperatures"))).unsafeRunSync
service.orNotFound.run(Put(measurement1)).unsafeRunSync
service.orNotFound.run(Put(measurement2)).unsafeRunSync
Expand Down Expand Up @@ -456,7 +421,7 @@ class TemperatureEndpointTest extends Specification {


val clock = fixedClock(Instant.ofEpochSecond(300))
val service = TemperatureEndpoint(stubReader(\/-(List())), stubWriter(\/-(Unit)))(clock)
val service = TemperatureEndpoint(stubReader(\/-(List())))(clock)
service.orNotFound.run(Request[IO](DELETE, Uri.uri("/temperatures"))).unsafeRunSync
service.orNotFound.run(Put(measurement1)).unsafeRunSync
service.orNotFound.run(Put(measurement2)).unsafeRunSync
Expand Down

0 comments on commit c040152

Please sign in to comment.