github.com/Financial-Times/publish-availability-monitor@v1.12.0/checks/scheduler_test.go (about)

     1  package checks
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/Financial-Times/go-logger/v2"
     8  	"github.com/Financial-Times/publish-availability-monitor/config"
     9  	"github.com/Financial-Times/publish-availability-monitor/content"
    10  	"github.com/Financial-Times/publish-availability-monitor/envs"
    11  	"github.com/Financial-Times/publish-availability-monitor/metrics"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestStrSliceContains(testing *testing.T) {
    16  	var tests = []struct {
    17  		validTypes  []string
    18  		typeToCheck string
    19  		expected    bool
    20  	}{
    21  		{
    22  			validTypes:  []string{"ValidType", "AnotherValidType"},
    23  			typeToCheck: "InvalidType",
    24  			expected:    false,
    25  		},
    26  		{
    27  			validTypes:  []string{"ValidType", "AnotherValidType"},
    28  			typeToCheck: "AnotherValidType",
    29  			expected:    true,
    30  		},
    31  	}
    32  
    33  	for _, t := range tests {
    34  		actual := strSliceContains(t.validTypes, t.typeToCheck)
    35  		if actual != t.expected {
    36  			testing.Errorf("Test Case: %v\nActual: %v", t, actual)
    37  		}
    38  	}
    39  }
    40  
    41  func TestScheduleChecksForContentAreCorrect(testing *testing.T) {
    42  	//redefine appConfig to have only Content
    43  	appConfig := &config.AppConfig{
    44  		MetricConf: []config.MetricConfig{
    45  			{
    46  				Endpoint:    "/whatever/",
    47  				Granularity: 1,
    48  				Alias:       "content",
    49  				ContentTypes: []string{
    50  					"application/vnd.ft-upp-image+json",
    51  				},
    52  			},
    53  		},
    54  		Threshold: 1,
    55  	}
    56  
    57  	var mockEnvironments = envs.NewEnvironments()
    58  	readURL := "http://env1.example.org"
    59  	mockEnvironments.SetEnvironment("env1", envs.Environment{
    60  		Name:     "env1",
    61  		ReadURL:  readURL,
    62  		Username: "user1",
    63  		Password: "pass1",
    64  	})
    65  
    66  	var genericImage = content.GenericContent{UUID: "e28b12f7-9796-3331-b030-05082f0b8157", Type: "application/vnd.ft-upp-image+json"}
    67  	capturingMetrics := runScheduleChecks(testing, genericImage, mockEnvironments, appConfig)
    68  
    69  	require.NotNil(testing, capturingMetrics)
    70  	require.Equal(testing, 1, capturingMetrics.Len())
    71  	require.Equal(testing, readURL+"/whatever/", capturingMetrics.First().Endpoint.String())
    72  }
    73  
    74  func TestScheduleChecksForContentWithInternalComponentsAreCorrect(testing *testing.T) {
    75  	appConfig := &config.AppConfig{
    76  		MetricConf: []config.MetricConfig{
    77  			{
    78  				Endpoint:    "/internalcomponents/",
    79  				Granularity: 1,
    80  				Alias:       "internal-components",
    81  				ContentTypes: []string{
    82  					"application/vnd.ft-upp-article-internal+json",
    83  				},
    84  			},
    85  		},
    86  		Threshold: 1,
    87  	}
    88  
    89  	var mockEnvironments = envs.NewEnvironments()
    90  	readURL := "http://env1.example.org"
    91  
    92  	mockEnvironments.SetEnvironment("env1", envs.Environment{
    93  		Name:     "env1",
    94  		ReadURL:  readURL,
    95  		Username: "user1",
    96  		Password: "pass1",
    97  	})
    98  
    99  	var genericArticleInternal = content.GenericContent{UUID: "a24da1d4-1524-2322-c231-25032d0f8334", Type: "application/vnd.ft-upp-article-internal+json"}
   100  	capturingMetrics := runScheduleChecks(testing, genericArticleInternal, mockEnvironments, appConfig)
   101  
   102  	require.NotNil(testing, capturingMetrics)
   103  	require.Equal(testing, 1, capturingMetrics.Len())
   104  	require.Equal(testing, readURL+"/internalcomponents/", capturingMetrics.First().Endpoint.String())
   105  }
   106  
   107  func runScheduleChecks(t *testing.T, content content.Content, mockEnvironments *envs.Environments, appConfig *config.AppConfig) *metrics.History {
   108  	capturingMetrics := metrics.NewHistory(make([]metrics.PublishMetric, 0))
   109  
   110  	tid := "tid_1234"
   111  	publishDate, err := time.Parse(DateLayout, "2016-01-08T14:22:06.271Z")
   112  	if err != nil {
   113  		t.Error("Failure in setting up test data")
   114  		return nil
   115  	}
   116  
   117  	param := &SchedulerParam{
   118  		contentToCheck:  content,
   119  		publishDate:     publishDate,
   120  		tid:             tid,
   121  		isMarkedDeleted: true,
   122  		metricContainer: capturingMetrics,
   123  		environments:    mockEnvironments,
   124  	}
   125  	//redefine map to avoid actual checks
   126  	endpointSpecificChecks := map[string]EndpointSpecificCheck{}
   127  	//redefine metricSink to avoid hang
   128  	metricSink := make(chan metrics.PublishMetric, 2)
   129  	log := logger.NewUPPLogger("test", "PANIC")
   130  
   131  	ScheduleChecks(
   132  		param,
   133  		endpointSpecificChecks,
   134  		appConfig,
   135  		metricSink,
   136  		nil,
   137  		log,
   138  	)
   139  	for {
   140  		if capturingMetrics.Len() == mockEnvironments.Len() {
   141  			return capturingMetrics
   142  		}
   143  
   144  		time.Sleep(1 * time.Second)
   145  	}
   146  }