github.com/nais/knorten@v0.0.0-20240104110906-55926958e361/pkg/database/events_test.go (about)

     1  package database
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/nais/knorten/pkg/database/gensql"
     8  )
     9  
    10  func TestRepo_DispatchableEventsGet(t *testing.T) {
    11  	ctx := context.Background()
    12  	team := gensql.Team{
    13  		ID:    "team-a-1234",
    14  		Slug:  "team-a",
    15  		Users: []string{"dummy@nav.no"},
    16  	}
    17  	if err := repo.TeamCreate(ctx, team); err != nil {
    18  		t.Fatal(err)
    19  	}
    20  	if err := cleanupEvents(); err != nil {
    21  		t.Fatal(err)
    22  	}
    23  	t.Cleanup(func() {
    24  		if err := repo.TeamDelete(ctx, team.ID); err != nil {
    25  			t.Fatal(err)
    26  		}
    27  	})
    28  
    29  	type args struct {
    30  		events []gensql.Event
    31  	}
    32  	tests := []struct {
    33  		name string
    34  		args args
    35  		want []gensql.Event
    36  	}{
    37  		{
    38  			name: "Dispatchable events verify priority",
    39  			args: args{
    40  				events: []gensql.Event{
    41  					{
    42  						Type:    string(EventTypeUpdateTeam),
    43  						Payload: []byte("{}"),
    44  						Status:  string(EventStatusPending),
    45  						Owner:   team.ID,
    46  					},
    47  					{
    48  						Type:    string(EventTypeDeleteTeam),
    49  						Payload: []byte("{}"),
    50  						Status:  string(EventStatusNew),
    51  						Owner:   team.ID,
    52  					},
    53  					{
    54  						Type:    string(EventTypeCreateTeam),
    55  						Payload: []byte("{}"),
    56  						Status:  string(EventStatusNew),
    57  						Owner:   team.ID,
    58  					},
    59  				},
    60  			},
    61  			want: []gensql.Event{
    62  				{
    63  					Type:    string(EventTypeUpdateTeam),
    64  					Payload: []byte("{}"),
    65  					Status:  string(EventStatusPending),
    66  					Owner:   team.ID,
    67  				},
    68  			},
    69  		},
    70  		{
    71  			name: "Dispatchable events verify new not dispatchable when processing same type",
    72  			args: args{
    73  				events: []gensql.Event{
    74  					{
    75  						Type:    string(EventTypeDeleteJupyter),
    76  						Payload: []byte("{}"),
    77  						Status:  string(EventStatusNew),
    78  						Owner:   team.ID,
    79  					},
    80  					{
    81  						Type:    string(EventTypeUpdateJupyter),
    82  						Payload: []byte("{}"),
    83  						Status:  string(EventStatusProcessing),
    84  						Owner:   team.ID,
    85  					},
    86  				},
    87  			},
    88  			want: []gensql.Event{},
    89  		},
    90  	}
    91  	for _, tt := range tests {
    92  		t.Run(tt.name, func(t *testing.T) {
    93  			if err := prepareEventsTest(tt.args.events); err != nil {
    94  				t.Error(err)
    95  			}
    96  			t.Cleanup(func() {
    97  				if err := cleanupEvents(); err != nil {
    98  					t.Error(err)
    99  				}
   100  			})
   101  
   102  			events, err := repo.DispatchableEventsGet(ctx)
   103  			if err != nil {
   104  				t.Error(err)
   105  			}
   106  
   107  			if len(events) != len(tt.want) {
   108  				t.Errorf("dispatchable events: expected %v events, got %v", len(tt.want), len(events))
   109  			}
   110  
   111  			for i, event := range events {
   112  				if event.Type != tt.want[i].Type {
   113  					t.Errorf("dispatchable events: expected type %v, got %v", tt.want[i].Type, event.Type)
   114  				}
   115  				if event.Owner != tt.want[i].Owner {
   116  					t.Errorf("dispatchable events: expected owner %v, got %v", tt.want[i].Owner, event.Owner)
   117  				}
   118  				if event.Status != tt.want[i].Status {
   119  					t.Errorf("dispatchable events: expected status %v, got %v", tt.want[i].Status, event.Status)
   120  				}
   121  			}
   122  		})
   123  	}
   124  }
   125  
   126  func prepareEventsTest(events []gensql.Event) error {
   127  	for _, event := range events {
   128  		_, err := repo.db.Exec("INSERT INTO events (owner,type,payload,deadline,status) VALUES ($1,$2,$3,$4,$5);",
   129  			event.Owner, EventType(event.Type), event.Payload, "00:05:00", event.Status)
   130  		if err != nil {
   131  			return err
   132  		}
   133  	}
   134  
   135  	return nil
   136  }
   137  
   138  func cleanupEvents() error {
   139  	_, err := repo.db.Exec("DELETE FROM events")
   140  	if err != nil {
   141  		return err
   142  	}
   143  
   144  	return nil
   145  }