From 98b14220e7e4b37f9494229192cebd9dcebdfcd5 Mon Sep 17 00:00:00 2001 From: charles Date: Tue, 24 Mar 2026 23:16:22 -0700 Subject: [PATCH] add: some tests --- .gitignore | 1 + Makefile | 19 +++- cmd/webstory/main.go | 30 ++++++ pkg/webstory_service/errors/errors.go | 6 ++ pkg/webstory_service/webstory_service.go | 92 +++++++++++++++++++ pkg/webstory_service/webstory_service_test.go | 14 +++ 6 files changed, 159 insertions(+), 3 deletions(-) create mode 100644 cmd/webstory/main.go create mode 100644 pkg/webstory_service/errors/errors.go create mode 100644 pkg/webstory_service/webstory_service.go create mode 100644 pkg/webstory_service/webstory_service_test.go diff --git a/.gitignore b/.gitignore index c2658d7..204ade5 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules/ +bin/ diff --git a/Makefile b/Makefile index 2849ccd..f11084c 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,18 @@ -.PHONY: proto proto-deps help +.PHONY: all build test proto proto-deps help # Default target -all: help +all: build + +# Build Go project +build: + @echo "Building Go project..." + go build -o bin/webstory ./cmd/webstory || exit 1 + @echo "Build complete!" + +# Run tests +test: + @echo "Running tests..." + go test -v ./... # Generate Go code from proto files using buf proto: proto-deps @@ -18,6 +29,8 @@ help: @echo "Webstory Makefile" @echo "" @echo "Available targets:" - @echo " make all - Show this help message" + @echo " make all - Show this help message (default)" + @echo " make build - Build Go project" + @echo " make test - Run tests" @echo " make proto - Generate Go code from proto files" @echo " make proto-deps - Ensure buf is installed" diff --git a/cmd/webstory/main.go b/cmd/webstory/main.go new file mode 100644 index 0000000..2bb4db3 --- /dev/null +++ b/cmd/webstory/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "fmt" + "log" + "net" + + "google.golang.org/grpc" + + v1 "git.tipsy.codes/charles/webstory/pkg/api/webstory/v1" + "git.tipsy.codes/charles/webstory/pkg/webstory_service" +) + +func main() { + lis, err := net.Listen("tcp", ":50051") + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + + server := grpc.NewServer() + + defer server.GracefulStop() + + v1.RegisterWebstoryServiceServer(server, &webstory_service.WebstoryServiceServer{}) + + fmt.Println("Starting gRPC server on :50051") + if err := server.Serve(lis); err != nil { + log.Fatalf("failed to serve: %v", err) + } +} diff --git a/pkg/webstory_service/errors/errors.go b/pkg/webstory_service/errors/errors.go new file mode 100644 index 0000000..e51145e --- /dev/null +++ b/pkg/webstory_service/errors/errors.go @@ -0,0 +1,6 @@ +package errors + +import "errors" + +// ErrNotImplemented is returned when an RPC method has not been implemented yet. +var ErrNotImplemented = errors.New("method not implemented") diff --git a/pkg/webstory_service/webstory_service.go b/pkg/webstory_service/webstory_service.go new file mode 100644 index 0000000..d379f8b --- /dev/null +++ b/pkg/webstory_service/webstory_service.go @@ -0,0 +1,92 @@ +package webstory_service + +import ( + "context" + + "google.golang.org/protobuf/types/known/emptypb" + + v1 "git.tipsy.codes/charles/webstory/pkg/api/webstory/v1" + "git.tipsy.codes/charles/webstory/pkg/webstory_service/errors" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +type WebstoryServiceServer struct { + v1.UnimplementedWebstoryServiceServer +} + +// GetStory retrieves a story by its resource name. +func (s *WebstoryServiceServer) GetStory(ctx context.Context, req *v1.GetStoryRequest) (*v1.Story, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// ListStories returns a list of stories. +func (s *WebstoryServiceServer) ListStories(ctx context.Context, req *v1.ListStoriesRequest) (*v1.ListStoriesResponse, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// CreateStory creates a new story. +func (s *WebstoryServiceServer) CreateStory(ctx context.Context, req *v1.CreateStoryRequest) (*v1.Story, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// UpdateStory updates an existing story. +func (s *WebstoryServiceServer) UpdateStory(ctx context.Context, req *v1.UpdateStoryRequest) (*v1.Story, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// DeleteStory deletes a story. +func (s *WebstoryServiceServer) DeleteStory(ctx context.Context, req *v1.DeleteStoryRequest) (*emptypb.Empty, error) { + return &emptypb.Empty{}, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// GetScene retrieves a scene by its resource name. +func (s *WebstoryServiceServer) GetScene(ctx context.Context, req *v1.GetSceneRequest) (*v1.Scene, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// ListScenes returns a list of scenes for a story. +func (s *WebstoryServiceServer) ListScenes(ctx context.Context, req *v1.ListScenesRequest) (*v1.ListScenesResponse, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// CreateScene creates a new scene in a story. +func (s *WebstoryServiceServer) CreateScene(ctx context.Context, req *v1.CreateSceneRequest) (*v1.Scene, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// UpdateScene updates an existing scene. +func (s *WebstoryServiceServer) UpdateScene(ctx context.Context, req *v1.UpdateSceneRequest) (*v1.Scene, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// DeleteScene deletes a scene. +func (s *WebstoryServiceServer) DeleteScene(ctx context.Context, req *v1.DeleteSceneRequest) (*emptypb.Empty, error) { + return &emptypb.Empty{}, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// GetActor retrieves an actor by its resource name. +func (s *WebstoryServiceServer) GetActor(ctx context.Context, req *v1.GetActorRequest) (*v1.Actor, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// ListActors returns a list of actors for a story. +func (s *WebstoryServiceServer) ListActors(ctx context.Context, req *v1.ListActorsRequest) (*v1.ListActorsResponse, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// CreateActor creates a new actor in a story. +func (s *WebstoryServiceServer) CreateActor(ctx context.Context, req *v1.CreateActorRequest) (*v1.Actor, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// UpdateActor updates an existing actor. +func (s *WebstoryServiceServer) UpdateActor(ctx context.Context, req *v1.UpdateActorRequest) (*v1.Actor, error) { + return nil, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} + +// DeleteActor deletes an actor. +func (s *WebstoryServiceServer) DeleteActor(ctx context.Context, req *v1.DeleteActorRequest) (*emptypb.Empty, error) { + return &emptypb.Empty{}, status.Error(codes.Unimplemented, errors.ErrNotImplemented.Error()) +} diff --git a/pkg/webstory_service/webstory_service_test.go b/pkg/webstory_service/webstory_service_test.go new file mode 100644 index 0000000..586c49f --- /dev/null +++ b/pkg/webstory_service/webstory_service_test.go @@ -0,0 +1,14 @@ +package webstory_service + +import ( + "testing" + + v1 "git.tipsy.codes/charles/webstory/pkg/api/webstory/v1" +) + +// Test_WebstoryServiceServer_ImplementsInterface ensures that WebstoryServiceServer +// implements the v1.WebstoryServiceServer interface. This is a compile-time check +// that will fail if the interface changes or if methods are missing. +func Test_WebstoryServiceServer_ImplementsInterface(t *testing.T) { + var _ v1.WebstoryServiceServer = (*WebstoryServiceServer)(nil) +}