From 472c5f120bf9818ce863d6cb475e6660b0ff9701 Mon Sep 17 00:00:00 2001 From: Gemeng Qin Date: Wed, 31 Oct 2018 21:46:19 +0800 Subject: [PATCH] Parse http request body to domain command --- Gopkg.lock | 188 ++++++++++++++++++++++++---- Gopkg.toml | 41 +++++- cmd/hangout/lambda/main.go | 4 +- hangout/hangout_suite_test.go | 13 ++ {hangout_bot => hangout}/helpers.go | 19 +-- hangout/helpers_test.go | 97 ++++++++++++++ 6 files changed, 322 insertions(+), 40 deletions(-) create mode 100644 hangout/hangout_suite_test.go rename {hangout_bot => hangout}/helpers.go (75%) create mode 100644 hangout/helpers_test.go diff --git a/Gopkg.lock b/Gopkg.lock index 5c89efb..63dc0f6 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,7 +2,7 @@ [[projects]] - digest = "1:29401894b0873ce84bca18ddb3d614300851999478cc2ce4de6fe473db4842b6" + digest = "1:014e79cf5c422dd0547a87bde33c7f7b3cd29116a96fac8897c7e50f18531dea" name = "github.com/aws/aws-lambda-go" packages = [ "events", @@ -10,12 +10,12 @@ "lambda/messages", "lambdacontext", ] - pruneopts = "" - revision = "4d30d0ff60440c2d0480a15747c96ee71c3c53d4" - version = "v1.2.0" + pruneopts = "UT" + revision = "2d482ef09017ae953b1e8d5a6ddac5b696663a3c" + version = "v1.6.0" [[projects]] - digest = "1:9dfdecc03ecd10fc21f8ae3c02e2061c24a6aa2e13d0e3308329841d16dc892f" + digest = "1:f29ee00a564df0ed243a11ef4ba7903caae682c29a7c9f8fc2322a5aae80fc70" name = "github.com/aws/aws-sdk-go" packages = [ "aws", @@ -49,55 +49,165 @@ "service/dynamodb", "service/sts", ] - pruneopts = "" - revision = "9e9afa0895e9daff556cc18f90dc53eb91f41ffd" - version = "v1.14.26" + pruneopts = "UT" + revision = "c35fe9d06b9f0cefe538ecdb7501c84603119dfb" + version = "v1.15.56" [[projects]] - digest = "1:858b7fe7b0f4bc7ef9953926828f2816ea52d01a88d72d1c45bc8c108f23c356" + branch = "master" + digest = "1:6b3d9c65ec0e4c7f48429cba15ca0114cf4d10201168ee42ef082f9fd24c4bbc" + name = "github.com/fnproject/fdk-go" + packages = [ + ".", + "utils", + ] + pruneopts = "UT" + revision = "1c783fe496250a3e27445273fb43cace6fd4ee2b" + +[[projects]] + digest = "1:15e27372d379b45b18ac917b9dafc45c45485239490ece18cca97a12f9591146" name = "github.com/go-ini/ini" packages = ["."] - pruneopts = "" - revision = "358ee7663966325963d4e8b2e1fbd570c5195153" - version = "v1.38.1" + pruneopts = "UT" + revision = "9c8236e659b76e87bf02044d06fde8683008ff3e" + version = "v1.39.0" [[projects]] - digest = "1:6f49eae0c1e5dab1dafafee34b207aeb7a42303105960944828c2079b92fc88e" + branch = "master" + digest = "1:59392ed8afb901aab4287d4894df8191722e34f3957716f4350c8c133ce99046" + name = "github.com/hpcloud/tail" + packages = [ + ".", + "ratelimiter", + "util", + "watch", + "winfile", + ] + pruneopts = "UT" + revision = "a1dbeea552b7c8df4b542c66073e393de198a800" + +[[projects]] + digest = "1:e22af8c7518e1eab6f2eab2b7d7558927f816262586cd6ed9f349c97a6c285c4" name = "github.com/jmespath/go-jmespath" packages = ["."] - pruneopts = "" + pruneopts = "UT" revision = "0b12d6b5" [[projects]] - digest = "1:091310675f48748a9b227ba2a28eb75ad25fb3bbd96f081a362b83d9073a54c3" + digest = "1:42e29deef12327a69123b9cb2cb45fee4af5c12c2a23c6e477338279a052703f" + name = "github.com/onsi/ginkgo" + packages = [ + ".", + "config", + "internal/codelocation", + "internal/containernode", + "internal/failer", + "internal/leafnodes", + "internal/remote", + "internal/spec", + "internal/spec_iterator", + "internal/specrunner", + "internal/suite", + "internal/testingtproxy", + "internal/writer", + "reporters", + "reporters/stenographer", + "reporters/stenographer/support/go-colorable", + "reporters/stenographer/support/go-isatty", + "types", + ] + pruneopts = "UT" + revision = "3774a09d95489ccaa16032e0770d08ea77ba6184" + version = "v1.6.0" + +[[projects]] + digest = "1:ab54eea8d482272009e9e4af07d4d9b5236c27b4d8c54a3f2c99d163be883eca" + name = "github.com/onsi/gomega" + packages = [ + ".", + "format", + "internal/assertion", + "internal/asyncassertion", + "internal/oraclematcher", + "internal/testingtsupport", + "matchers", + "matchers/support/goraph/bipartitegraph", + "matchers/support/goraph/edge", + "matchers/support/goraph/node", + "matchers/support/goraph/util", + "types", + ] + pruneopts = "UT" + revision = "7615b9433f86a8bdf29709bf288bc4fd0636a369" + version = "v1.4.2" + +[[projects]] + digest = "1:96ac300b2373fc25f05af24a4d55857fd9a409b7c5d7e9be5e6b485997af3d5a" name = "github.com/stretchr/testify" packages = ["assert"] - pruneopts = "" + pruneopts = "UT" revision = "232e8563676cd15c3a36ba5e675ad4312ac4cb11" version = "v1.0" [[projects]] - digest = "1:3bfdafac43ceb125f775eb79b8ee8f1e976e227464434ffad40f956ac029e760" + digest = "1:420817f94b6c172dabb8a054d0b2d257d7437a87c7c8c7ee432bc008a577fc46" name = "github.com/technoweenie/multipartstreamer" packages = ["."] - pruneopts = "" + pruneopts = "UT" revision = "a90a01d73ae432e2611d178c18367fbaa13e0154" version = "v1.0.1" [[projects]] branch = "master" - digest = "1:547dcb6aebfb7fb17947660ebb034470c13f4d63d893def190a2f7ba3d09bc38" + digest = "1:d0a0bdd2b64d981aa4e6a1ade90431d042cd7fa31b584e33d45e62cbfec43380" name = "golang.org/x/net" packages = [ "context", "context/ctxhttp", + "html", + "html/atom", + "html/charset", ] - pruneopts = "" + pruneopts = "UT" revision = "49bb7cea24b1df9410e1712aa6433dae904ff66a" [[projects]] branch = "master" - digest = "1:db8adde0e8b04865546c057782ce223a36e35deae3224f908cb9d2f53abc7a52" + digest = "1:0a40b0bdd57a93e741d8557465be3a2edeec408e9b6399586ad65bbe8e355796" + name = "golang.org/x/sys" + packages = ["unix"] + pruneopts = "UT" + revision = "fa43e7bc11baaae89f3f902b2b4d832b68234844" + +[[projects]] + digest = "1:aa4d6967a3237f8367b6bf91503964a77183ecf696f1273e8ad3551bb4412b5f" + name = "golang.org/x/text" + packages = [ + "encoding", + "encoding/charmap", + "encoding/htmlindex", + "encoding/internal", + "encoding/internal/identifier", + "encoding/japanese", + "encoding/korean", + "encoding/simplifiedchinese", + "encoding/traditionalchinese", + "encoding/unicode", + "internal/gen", + "internal/tag", + "internal/utf8internal", + "language", + "runes", + "transform", + "unicode/cldr", + ] + pruneopts = "UT" + revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" + version = "v0.3.0" + +[[projects]] + branch = "master" + digest = "1:cb1e2e4b3801b41d13415ade6b55e7b30149971733fe6bc31e96bde92ff365a2" name = "google.golang.org/api" packages = [ "chat/v1", @@ -105,16 +215,39 @@ "googleapi", "googleapi/internal/uritemplates", ] - pruneopts = "" + pruneopts = "UT" revision = "3f6e8463aa1d824abe11b439d178c02220079da5" [[projects]] - digest = "1:1a95777771ac93e770a5c5d25066de5fb10d43a7a1cb1dced6727c447490f10f" + digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" + name = "gopkg.in/fsnotify/fsnotify.v1" + packages = ["."] + pruneopts = "UT" + revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" + version = "v1.4.7" + +[[projects]] + digest = "1:51712f342cdefcad2c867f399a3ce8223675221d4386c81cfcccd8f0656e722e" name = "gopkg.in/telegram-bot-api.v4" packages = ["."] - pruneopts = "" - revision = "0e0af0c480ea98e982d5f4d45fb39577c6ab1e3e" - version = "v4.6.2" + pruneopts = "UT" + revision = "9860bdfd3a171ceafb6e1eafa163482a6ef92643" + version = "v4.6.4" + +[[projects]] + digest = "1:3c839a777de0e6da035c9de900b60cbec463b0a89351192c1ea083eaf9e0fce0" + name = "gopkg.in/tomb.v1" + packages = ["."] + pruneopts = "UT" + revision = "c131134a1947e9afd9cecfe11f4c6dff0732ae58" + +[[projects]] + digest = "1:342378ac4dcb378a5448dd723f0784ae519383532f5e70ade24132c4c8693202" + name = "gopkg.in/yaml.v2" + packages = ["."] + pruneopts = "UT" + revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" + version = "v2.2.1" [solve-meta] analyzer-name = "dep" @@ -125,6 +258,9 @@ "github.com/aws/aws-sdk-go/aws", "github.com/aws/aws-sdk-go/aws/session", "github.com/aws/aws-sdk-go/service/dynamodb", + "github.com/fnproject/fdk-go", + "github.com/onsi/ginkgo", + "github.com/onsi/gomega", "github.com/stretchr/testify/assert", "google.golang.org/api/chat/v1", "gopkg.in/telegram-bot-api.v4", diff --git a/Gopkg.toml b/Gopkg.toml index 8fce892..d248767 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -1,6 +1,6 @@ # Gopkg.toml example # -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md +# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html # for detailed Gopkg.toml documentation. # # required = ["github.com/user/thing/cmd/thing"] @@ -16,10 +16,43 @@ # source = "github.com/myfork/project2" # # [[override]] -# name = "github.com/x/y" -# version = "2.4.0" +# name = "github.com/x/y" +# version = "2.4.0" +# +# [prune] +# non-go = false +# go-tests = true +# unused-packages = true [[constraint]] name = "github.com/aws/aws-lambda-go" - version = "^1.0.1" + version = "1.6.0" + +[[constraint]] + name = "github.com/aws/aws-sdk-go" + version = "1.15.56" + +[[constraint]] + branch = "master" + name = "github.com/fnproject/fdk-go" + +[[constraint]] + name = "github.com/onsi/ginkgo" + version = "1.6.0" + +[[constraint]] + name = "github.com/stretchr/testify" + version = "1.0.0" + +[[constraint]] + branch = "master" + name = "google.golang.org/api" + +[[constraint]] + name = "gopkg.in/telegram-bot-api.v4" + version = "4.6.4" + +[prune] + go-tests = true + unused-packages = true diff --git a/cmd/hangout/lambda/main.go b/cmd/hangout/lambda/main.go index 5726c60..a36e372 100644 --- a/cmd/hangout/lambda/main.go +++ b/cmd/hangout/lambda/main.go @@ -6,7 +6,7 @@ import ( "github.com/aws/aws-lambda-go/lambda" "google.golang.org/api/chat/v1" "log" - "whosinbot/hangout_bot" + "whosinbot/hangout" "whosinbot/dynamodb" "whosinbot/whosinbot" ) @@ -18,7 +18,7 @@ func main() { func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { log.Printf("Request Body: " + request.Body) - command, err := hangout_bot.ParseDeprecatedEvent([]byte(request.Body)) + command, err := hangout.ParseDeprecatedEvent([]byte(request.Body)) if err != nil { return events.APIGatewayProxyResponse{StatusCode: 400}, err } diff --git a/hangout/hangout_suite_test.go b/hangout/hangout_suite_test.go new file mode 100644 index 0000000..4447d7a --- /dev/null +++ b/hangout/hangout_suite_test.go @@ -0,0 +1,13 @@ +package hangout_test + +import ( + "testing" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +func TestHangout(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Hangout Suite") +} diff --git a/hangout_bot/helpers.go b/hangout/helpers.go similarity index 75% rename from hangout_bot/helpers.go rename to hangout/helpers.go index bd49f88..5d6a8a6 100644 --- a/hangout_bot/helpers.go +++ b/hangout/helpers.go @@ -1,4 +1,4 @@ -package hangout_bot +package hangout import ( "encoding/json" @@ -6,25 +6,28 @@ import ( "log" "strings" "whosinbot/domain" + "errors" ) func ParseDeprecatedEvent(requestBody []byte) (domain.Command, error) { deprecatedEvent := chat.DeprecatedEvent{} err := json.Unmarshal(requestBody, &deprecatedEvent) - - log.Printf("deprecatedEvent: " + deprecatedEvent.Message.Text) - if err != nil { return domain.EmptyCommand(), err } + + log.Printf("deprecatedEvent: " + deprecatedEvent.Message.Text) + // TODO: split this into a mapping function and write some tests around it threadName := deprecatedEvent.Message.Thread.Name - argumentText := deprecatedEvent.Message.ArgumentText - tokens := strings.Split(argumentText, " ") + arguments := strings.Fields(deprecatedEvent.Message.ArgumentText) + if len(arguments) <= 0 { + return domain.EmptyCommand(), errors.New("no argument provided") + } command := domain.Command{ ChatID: threadName, - Name: tokens[0], - Params: []string{tokens[1]}, + Name: arguments[0], + Params: arguments[1:], From: domain.User{ UserID: deprecatedEvent.Message.Sender.Name, Name: deprecatedEvent.Message.Sender.DisplayName, diff --git a/hangout/helpers_test.go b/hangout/helpers_test.go new file mode 100644 index 0000000..bc4c7ca --- /dev/null +++ b/hangout/helpers_test.go @@ -0,0 +1,97 @@ +package hangout + +import ( + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "google.golang.org/api/chat/v1" + "encoding/json" + "whosinbot/domain" + "errors" +) + +var _ = Describe("helper", func() { + Describe("#ParseDeprecatedEvent", func() { + When("successful", func() { + It("parses request body to DeprecatedEvent", func() { + deprecatedEvent := chat.DeprecatedEvent{ + Action: nil, + ConfigCompleteRedirectUrl: "", + EventTime: "", + Message: &chat.Message{ + ArgumentText: " cmdName argument1 argument2", + Sender: &chat.User{ + DisplayName: "Ryuichi Sakamoto", + Name: "users/1234567", + }, + Thread: &chat.Thread{ + Name: "thread1", + }, + }, + } + requestBody, _ := json.Marshal(deprecatedEvent) + command, _ := ParseDeprecatedEvent(requestBody) + + Expect(command.ChatID).To(Equal("thread1")) + Expect(command.Name).To(Equal("cmdName")) + Expect(command.Params).To(Equal([]string{"argument1", "argument2"})) + Expect(command.From).To(BeEquivalentTo(domain.User{ + UserID: "users/1234567", + Name: "Ryuichi Sakamoto", + })) + }) + }) + + When("failed", func() { + Context("when there is no arguments provided", func() { + deprecatedEvent := getEventWithNoArguments() + + It("returns empty command", func() { + requestBody, _ := json.Marshal(deprecatedEvent) + command, _ := ParseDeprecatedEvent(requestBody) + + Expect(command).To(BeEquivalentTo(domain.EmptyCommand())) + }) + + It("returns error", func() { + requestBody, _ := json.Marshal(deprecatedEvent) + _, err := ParseDeprecatedEvent(requestBody) + + Expect(err).To(BeEquivalentTo( errors.New("no argument provided"))) + }) + }) + + Context("when can't be unmarshaled to event", func() { + requestBody, _ := json.Marshal([]byte("something")) + + It("returns empty command", func() { + command, _ := ParseDeprecatedEvent(requestBody) + + Expect(command).To(BeEquivalentTo(domain.EmptyCommand())) + }) + + It("returns error", func() { + _, err := ParseDeprecatedEvent(requestBody) + + Expect(err).To(HaveOccurred()) + }) + }) + }) + }) +}) + +func getEventWithNoArguments() chat.DeprecatedEvent { + return chat.DeprecatedEvent{ + Action: nil, + ConfigCompleteRedirectUrl: "", + EventTime: "", + Message: &chat.Message{ + Sender: &chat.User{ + DisplayName: "Ryuichi Sakamoto", + Name: "users/1234567", + }, + Thread: &chat.Thread{ + Name: "thread1", + }, + }, + } +}