From b27ff56ab4f905c31d8cb6aabf2e10f69f972b2b Mon Sep 17 00:00:00 2001
From: Erick Hitter <git-contrib@ethitter.com>
Date: Sun, 19 Aug 2018 15:35:34 -0700
Subject: [PATCH] Abstract staleness-check so it can be tested

---
 glrdomon.go      | 36 +++++++++++++++++++++++++-----------
 glrdomon_test.go | 30 +++++++++++++++++++++++++++++-
 2 files changed, 54 insertions(+), 12 deletions(-)

diff --git a/glrdomon.go b/glrdomon.go
index 992db62..29b2f1e 100644
--- a/glrdomon.go
+++ b/glrdomon.go
@@ -115,7 +115,7 @@ func checkAPI() {
 
 	for _, droplet := range droplets {
 		wg.Add(1)
-		go checkDropletAge(droplet)
+		go checkDroplet(droplet)
 	}
 }
 
@@ -148,24 +148,38 @@ func listDroplets(ctx context.Context, client *godo.Client) ([]godo.Droplet, err
 	return list, nil
 }
 
-func checkDropletAge(droplet godo.Droplet) {
+func checkDroplet(droplet godo.Droplet) {
 	defer wg.Done()
 
+	if !checkDropletAge(droplet) {
+		return
+	}
+
+	deleted := deleteDroplet(droplet)
+	if deleteStale {
+		if deleted {
+			logger.Printf("Removed droplet %s (%d)", droplet.Name, droplet.ID)
+		} else {
+			logger.Printf("Failed to delete droplet %s (%d)", droplet.Name, droplet.ID)
+		}
+	}
+}
+
+func checkDropletAge(droplet godo.Droplet) bool {
 	thr := time.Now().Add(time.Duration(-threshold))
 	created, err := time.Parse(time.RFC3339, droplet.Created)
 	if err != nil {
 		logger.Printf("Could not parse created-timestamp for droplet ID %d", droplet.ID)
-		return
+		return false
 	}
 
-	if thr.After(created) {
-		logger.Printf("Stale droplet => ID: %d; name: \"%s\"; created: %s, %s (%d)", droplet.ID, droplet.Name, humanize.Time(created), droplet.Created, created.Unix())
+	stale := thr.After(created)
 
-		deleted := deleteDroplet(droplet)
-		if deleteStale && !deleted {
-			logger.Printf("Failed to delete droplet ID %d", droplet.ID)
-		}
+	if stale {
+		logger.Printf("Stale droplet => ID: %d; name: \"%s\"; created: %s, %s (%d)", droplet.ID, droplet.Name, humanize.Time(created), droplet.Created, created.Unix())
 	}
+
+	return stale
 }
 
 func deleteDroplet(droplet godo.Droplet) bool {
@@ -173,12 +187,12 @@ func deleteDroplet(droplet godo.Droplet) bool {
 		return false
 	}
 
-	logger.Printf("Deleting droplet %d", droplet.ID)
+	logger.Printf("Deleting droplet %s (%d)", droplet.Name, droplet.ID)
 
 	ctx := context.TODO()
 	_, err := client.Droplets.Delete(ctx, droplet.ID)
 
-	return err != nil
+	return err == nil
 }
 
 func setUpLogger() {
diff --git a/glrdomon_test.go b/glrdomon_test.go
index 4c11ca1..67330b1 100644
--- a/glrdomon_test.go
+++ b/glrdomon_test.go
@@ -1,6 +1,34 @@
 package main
 
-import "testing"
+import (
+	"testing"
+	"time"
+
+	"github.com/digitalocean/godo"
+)
+
+func TestCheckDropletAge(t *testing.T) {
+	staleDroplet := godo.Droplet{
+		ID:      1234,
+		Name:    "very-old",
+		Created: "2000-08-19T19:07:04Z",
+	}
+
+	if !checkDropletAge(staleDroplet) {
+		t.Error("Failed to assert that very old droplet is stale")
+	}
+
+	now := time.Now()
+	newDroplet := godo.Droplet{
+		ID:      5678,
+		Name:    "new",
+		Created: now.Format(time.RFC3339),
+	}
+
+	if checkDropletAge(newDroplet) {
+		t.Error("Asserted that brand-new droplet is stale")
+	}
+}
 
 func TestValidatePath(t *testing.T) {
 	emptyString := ""
-- 
GitLab