From 17152a9d168c8beb319b2eb607e318c2e10772d1 Mon Sep 17 00:00:00 2001 From: rupinder-syngh Date: Thu, 20 Mar 2025 18:28:02 +0530 Subject: [PATCH] fix: Remove implementation --- .../implementation/publisher/cmd/plugin.go | 51 ---------- .../publisher/cmd/plugin_test.go | 74 -------------- .../implementation/publisher/publisher.go | 95 ------------------ .../publisher/publisher_test.go | 98 ------------------- 4 files changed, 318 deletions(-) delete mode 100644 pkg/plugin/implementation/publisher/cmd/plugin.go delete mode 100644 pkg/plugin/implementation/publisher/cmd/plugin_test.go delete mode 100644 pkg/plugin/implementation/publisher/publisher.go delete mode 100644 pkg/plugin/implementation/publisher/publisher_test.go diff --git a/pkg/plugin/implementation/publisher/cmd/plugin.go b/pkg/plugin/implementation/publisher/cmd/plugin.go deleted file mode 100644 index 561d6f2..0000000 --- a/pkg/plugin/implementation/publisher/cmd/plugin.go +++ /dev/null @@ -1,51 +0,0 @@ -package main - -import ( - "context" - "fmt" - - "github.com/beckn/beckn-onix/pkg/plugin/definition" - "github.com/beckn/beckn-onix/pkg/plugin/implementation/publisher" -) - -// Returns error if required fields are missing. -func validateConfig(config map[string]string) (*publisher.Config, error) { - if config == nil { - return nil, fmt.Errorf("config cannot be nil") - } - - project, ok := config["project"] - if !ok || project == "" { - return nil, fmt.Errorf("project ID is required") - } - - topic, ok := config["topic"] - if !ok || topic == "" { - return nil, fmt.Errorf("topic ID is required") - } - - return &publisher.Config{ - ProjectID: project, - TopicID: topic, - }, nil -} - -// PublisherProvider implements the definition.PublisherProvider interface. -type PublisherProvider struct{} - -// New creates a new Publisher instance. -func (p PublisherProvider) New(ctx context.Context, config map[string]string) (definition.Publisher, error) { - if ctx == nil { - return nil, fmt.Errorf("context cannot be nil") - } - - cfg, err := validateConfig(config) - if err != nil { - return nil, fmt.Errorf("invalid config: %w", err) - } - - return publisher.New(ctx, cfg) -} - -// Provider is the exported symbol that the plugin manager will look for. -var Provider definition.PublisherProvider = PublisherProvider{} diff --git a/pkg/plugin/implementation/publisher/cmd/plugin_test.go b/pkg/plugin/implementation/publisher/cmd/plugin_test.go deleted file mode 100644 index 4c40e54..0000000 --- a/pkg/plugin/implementation/publisher/cmd/plugin_test.go +++ /dev/null @@ -1,74 +0,0 @@ -package main - -import ( - "context" - "testing" - - "github.com/beckn/beckn-onix/pkg/plugin/definition" -) - -// MockPublisher is a mock implementation of the definition.Publisher interface for testing. -type MockPublisher struct{} - -func (m *MockPublisher) Publish(ctx context.Context, msg []byte) error { - return nil -} - -func (m *MockPublisher) Close() error { - return nil -} - -// TestValidateConfig tests the validateConfig function. -func TestValidateConfig(t *testing.T) { - tests := []struct { - name string - config map[string]string - wantErr bool - }{ - {"Valid config", map[string]string{"project": "test-project", "topic": "test-topic"}, false}, - {"Nil config", nil, true}, - {"Missing project", map[string]string{"topic": "test-topic"}, true}, - {"Missing topic", map[string]string{"project": "test-project"}, true}, - {"Empty project", map[string]string{"project": "", "topic": "test-topic"}, true}, - {"Empty topic", map[string]string{"project": "test-project", "topic": ""}, true}, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - _, err := validateConfig(tt.config) - if (err != nil) != tt.wantErr { - t.Errorf("validateConfig() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -// TestPublisherProviderNew tests the New method of PublisherProvider. -func TestPublisherProviderNew(t *testing.T) { - tests := []struct { - name string - ctx context.Context - config map[string]string - wantErr bool - }{ - {"Nil context", nil, map[string]string{"project": "test-project", "topic": "test-topic"}, true}, - {"Invalid config", context.Background(), map[string]string{"project": "", "topic": "test-topic"}, true}, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - provider := PublisherProvider{} - _, err := provider.New(tt.ctx, tt.config) - if (err != nil) != tt.wantErr { - t.Errorf("PublisherProvider.New() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -// TestProviderImplementation verifies that the Provider is correctly initialized. -func TestProviderImplementation(t *testing.T) { - if _, ok := interface{}(Provider).(definition.PublisherProvider); !ok { - t.Errorf("Provider does not implement definition.PublisherProvider") - } -} diff --git a/pkg/plugin/implementation/publisher/publisher.go b/pkg/plugin/implementation/publisher/publisher.go deleted file mode 100644 index 245a120..0000000 --- a/pkg/plugin/implementation/publisher/publisher.go +++ /dev/null @@ -1,95 +0,0 @@ -package publisher - -import ( - "context" - "errors" - "fmt" - "log" - "strings" - - "cloud.google.com/go/pubsub" - "google.golang.org/api/option" -) - -// Config holds the Pub/Sub configuration. -type Config struct { - ProjectID string - TopicID string -} - -// Publisher is a concrete implementation of a Google Cloud Pub/Sub publisher. -type Publisher struct { - client *pubsub.Client - topic *pubsub.Topic - config *Config -} - -var ( - ErrProjectMissing = errors.New("missing required field 'Project'") - ErrTopicMissing = errors.New("missing required field 'Topic'") - ErrEmptyConfig = errors.New("empty config") -) - - -func validate(cfg *Config) error { - if cfg == nil { - return ErrEmptyConfig - } - if strings.TrimSpace(cfg.ProjectID) == "" { - return ErrProjectMissing - } - if strings.TrimSpace(cfg.TopicID) == "" { - return ErrTopicMissing - } - return nil -} - -// New initializes a new Publisher instance. -// It creates a real pubsub.Client and then calls NewWithClient. -func New(ctx context.Context, config *Config, opts ...option.ClientOption) (*Publisher, error) { - if err := validate(config); err != nil { - return nil, err - } - client, err := pubsub.NewClient(ctx, config.ProjectID, opts...) - if err != nil { - return nil, fmt.Errorf("failed to create pubsub client: %w", err) - } - - topic := client.Topic(config.TopicID) - exists, err := topic.Exists(ctx) - if err != nil { - _ = client.Close() - return nil, fmt.Errorf("failed to check topic existence: %w", err) - } - if !exists { - _ = client.Close() - return nil, fmt.Errorf("topic %s does not exist", config.TopicID) - } - return &Publisher{ - client: client, - topic: topic, - config: config, - }, nil -} - - -// Publish sends a message to Google Cloud Pub/Sub. -func (p *Publisher) Publish(ctx context.Context, msg []byte) error { - pubsubMsg := &pubsub.Message{ - Data: msg, - } - - result := p.topic.Publish(ctx, pubsubMsg) - id, err := result.Get(ctx) - if err != nil { - return fmt.Errorf("failed to publish message: %w", err) - } - - log.Printf("Published message with ID: %s\n", id) - return nil -} - -// Close closes the underlying Pub/Sub client. -func (p *Publisher) Close() error { - return p.client.Close() -} diff --git a/pkg/plugin/implementation/publisher/publisher_test.go b/pkg/plugin/implementation/publisher/publisher_test.go deleted file mode 100644 index 9ca3d2c..0000000 --- a/pkg/plugin/implementation/publisher/publisher_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package publisher - -import ( - "context" - "errors" - "testing" -) - -// TestValidate tests the validate function. -func TestValidate(t *testing.T) { - tests := []struct { - name string - config *Config - wantErr error - }{ - { - name: "Valid config", - config: &Config{ProjectID: "test-project", TopicID: "test-topic"}, - wantErr: nil, - }, - { - name: "Nil config", - config: nil, - wantErr: ErrEmptyConfig, - }, - { - name: "Empty project ID", - config: &Config{ProjectID: "", TopicID: "test-topic"}, - wantErr: ErrProjectMissing, - }, - { - name: "Whitespace project ID", - config: &Config{ProjectID: " ", TopicID: "test-topic"}, - wantErr: ErrProjectMissing, - }, - { - name: "Empty topic ID", - config: &Config{ProjectID: "test-project", TopicID: ""}, - wantErr: ErrTopicMissing, - }, - { - name: "Whitespace topic ID", - config: &Config{ProjectID: "test-project", TopicID: " "}, - wantErr: ErrTopicMissing, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := validate(tt.config) - if !errors.Is(err, tt.wantErr) { - t.Errorf("validate() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -// TestNew tests the New function with validation errors only. -// We can't easily test the pubsub client creation parts without complex mocks. -func TestNew(t *testing.T) { - tests := []struct { - name string - ctx context.Context - config *Config - wantErr bool - }{ - { - // Should fail validation - name: "Empty project ID", - ctx: context.Background(), - config: &Config{ProjectID: "", TopicID: "test-topic"}, - wantErr: true, - }, - { - // Should fail validation - name: "Empty topic ID", - ctx: context.Background(), - config: &Config{ProjectID: "test-project", TopicID: ""}, - wantErr: true, - }, - { - // Should fail due to nil context - name: "Nil context", - ctx: nil, - config: &Config{ProjectID: "test-project", TopicID: "test-topic"}, - wantErr: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - _, err := New(tt.ctx, tt.config) - if (err != nil) != tt.wantErr { - t.Errorf("New() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -}