Files
onspring-api-sdk-go/records_integration_test.go

650 lines
18 KiB
Go

//go:build integration
package onspring_test
import (
"context"
"fmt"
"net/http"
"testing"
"github.com/StevanFreeborn/onspring-api-sdk-go"
)
func TestRecordsIntegration(t *testing.T) {
loadEnvFile(t)
client := createClient(t)
ctx := context.Background()
t.Run("Get", func(t *testing.T) {
t.Run("should get a record", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
recordId := requireEnvInt(t, "TEST_SURVEY_RECORD_ID")
record, err := client.Records.Get(ctx, surveyId, recordId)
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
if record.AppId != surveyId {
t.Errorf("Expected appId %d, got %d", surveyId, record.AppId)
}
if record.RecordId != recordId {
t.Errorf("Expected recordId %d, got %d", recordId, record.RecordId)
}
if len(record.FieldData) == 0 {
t.Error("Expected field data to not be empty")
}
for _, field := range record.FieldData {
if field.FieldId == 0 {
t.Error("Expected field id to not be zero")
}
if field.Type == "" {
t.Error("Expected field type to not be empty")
}
}
})
t.Run("should get a record when fieldIds and data format are passed as parameters", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
recordId := requireEnvInt(t, "TEST_SURVEY_RECORD_ID")
textFieldId := requireEnvInt(t, "TEST_TEXT_FIELD")
record, err := client.Records.Get(
ctx,
surveyId,
recordId,
onspring.WithFieldIds([]int{textFieldId}),
onspring.WithRecordDataFormat("Formatted"),
)
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
if record.AppId != surveyId {
t.Errorf("Expected appId %d, got %d", surveyId, record.AppId)
}
if record.RecordId != recordId {
t.Errorf("Expected recordId %d, got %d", recordId, record.RecordId)
}
if len(record.FieldData) == 0 {
t.Error("Expected field data to not be empty")
}
})
t.Run("should return a 401 error when an invalid API key is used", func(t *testing.T) {
invalidClient := createInvalidClient(t)
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
recordId := requireEnvInt(t, "TEST_SURVEY_RECORD_ID")
_, err := invalidClient.Records.Get(ctx, surveyId, recordId)
assertAPIError(t, err, http.StatusUnauthorized)
})
t.Run("should return a 404 error when an invalid record id is used", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
_, err := client.Records.Get(ctx, surveyId, 0)
assertAPIError(t, err, http.StatusNotFound)
})
})
t.Run("List", func(t *testing.T) {
t.Run("should get records", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
page, err := client.Records.List(ctx, surveyId)
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
if page.PageNumber == 0 {
t.Error("Expected page number to not be zero")
}
if page.TotalRecords == 0 {
t.Error("Expected total records to not be zero")
}
if len(page.Items) == 0 {
t.Error("Expected items to not be empty")
}
for _, record := range page.Items {
if record.AppId != surveyId {
t.Errorf("Expected appId %d, got %d", surveyId, record.AppId)
}
if record.RecordId == 0 {
t.Error("Expected recordId to not be zero")
}
}
})
t.Run("should get records when fieldIds, paging information, and data format are passed as parameters", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
textFieldId := requireEnvInt(t, "TEST_TEXT_FIELD")
page, err := client.Records.List(
ctx,
surveyId,
onspring.WithFieldIds([]int{textFieldId}),
onspring.WithRecordDataFormat("Formatted"),
onspring.WithPaging(onspring.ForPageNumber(1), onspring.WithPageSize(1)),
)
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
if page.PageNumber != 1 {
t.Errorf("Expected page number 1, got %d", page.PageNumber)
}
if page.PageSize != 1 {
t.Errorf("Expected page size 1, got %d", page.PageSize)
}
if len(page.Items) != 1 {
t.Errorf("Expected 1 item, got %d", len(page.Items))
}
})
t.Run("should return a 401 error when an invalid API key is passed", func(t *testing.T) {
invalidClient := createInvalidClient(t)
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
_, err := invalidClient.Records.List(ctx, surveyId)
assertAPIError(t, err, http.StatusUnauthorized)
})
t.Run("should return a 403 error when the api key does not have access to the app", func(t *testing.T) {
appIdNoAccess := requireEnvInt(t, "TEST_APP_ID_NO_ACCESS")
_, err := client.Records.List(ctx, appIdNoAccess)
assertAPIError(t, err, http.StatusForbidden)
})
})
t.Run("ListAll", func(t *testing.T) {
t.Run("should iterate all records for an app", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
var records []onspring.Record
for record, err := range client.Records.ListAll(ctx, surveyId, onspring.WithPaging(onspring.WithPageSize(1))) {
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
records = append(records, record)
}
if len(records) == 0 {
t.Error("Expected to iterate at least one record")
}
})
})
t.Run("GetMany", func(t *testing.T) {
t.Run("should get records", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
recordId := requireEnvInt(t, "TEST_SURVEY_RECORD_ID")
batch, err := client.Records.GetMany(ctx, onspring.GetManyRecordsRequest{
AppId: surveyId,
RecordIds: []int{recordId},
})
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
if batch.Count == 0 {
t.Error("Expected count to not be zero")
}
if len(batch.Items) == 0 {
t.Error("Expected items to not be empty")
}
for _, record := range batch.Items {
if record.AppId != surveyId {
t.Errorf("Expected appId %d, got %d", surveyId, record.AppId)
}
if record.RecordId == 0 {
t.Error("Expected recordId to not be zero")
}
}
})
t.Run("should get records when field ids and data format are passed as parameters", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
recordId := requireEnvInt(t, "TEST_SURVEY_RECORD_ID")
textFieldId := requireEnvInt(t, "TEST_TEXT_FIELD")
batch, err := client.Records.GetMany(ctx, onspring.GetManyRecordsRequest{
AppId: surveyId,
RecordIds: []int{recordId},
FieldIds: []int{textFieldId},
DataFormat: "Formatted",
})
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
if batch.Count == 0 {
t.Error("Expected count to not be zero")
}
if len(batch.Items) == 0 {
t.Error("Expected items to not be empty")
}
})
t.Run("should return a 400 error if too many record ids are passed", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
ids := make([]int, 101)
for i := range ids {
ids[i] = i + 1
}
_, err := client.Records.GetMany(ctx, onspring.GetManyRecordsRequest{
AppId: surveyId,
RecordIds: ids,
})
assertAPIError(t, err, http.StatusBadRequest)
})
t.Run("should return a 401 error if the api key is invalid", func(t *testing.T) {
invalidClient := createInvalidClient(t)
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
recordId := requireEnvInt(t, "TEST_SURVEY_RECORD_ID")
_, err := invalidClient.Records.GetMany(ctx, onspring.GetManyRecordsRequest{
AppId: surveyId,
RecordIds: []int{recordId},
})
assertAPIError(t, err, http.StatusUnauthorized)
})
t.Run("should return a 403 error if the user does not have access to the app", func(t *testing.T) {
appIdNoAccess := requireEnvInt(t, "TEST_APP_ID_NO_ACCESS")
recordId := requireEnvInt(t, "TEST_SURVEY_RECORD_ID")
_, err := client.Records.GetMany(ctx, onspring.GetManyRecordsRequest{
AppId: appIdNoAccess,
RecordIds: []int{recordId},
})
assertAPIError(t, err, http.StatusForbidden)
})
})
t.Run("Query", func(t *testing.T) {
t.Run("should return records", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
autoNumberField := requireEnvInt(t, "TEST_SURVEY_AUTO_NUMBER_FIELD")
filter := fmt.Sprintf("%d gt 0", autoNumberField)
page, err := client.Records.Query(ctx, onspring.QueryRecordsRequest{
AppId: surveyId,
Filter: filter,
})
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
if page.PageNumber == 0 {
t.Error("Expected page number to not be zero")
}
if page.TotalRecords == 0 {
t.Error("Expected total records to not be zero")
}
if len(page.Items) == 0 {
t.Error("Expected items to not be empty")
}
for _, record := range page.Items {
if record.AppId != surveyId {
t.Errorf("Expected appId %d, got %d", surveyId, record.AppId)
}
if record.RecordId == 0 {
t.Error("Expected recordId to not be zero")
}
}
})
t.Run("should return records when data format, paging information, and fields are passed as parameters", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
autoNumberField := requireEnvInt(t, "TEST_SURVEY_AUTO_NUMBER_FIELD")
textFieldId := requireEnvInt(t, "TEST_TEXT_FIELD")
filter := fmt.Sprintf("%d gt 0", autoNumberField)
page, err := client.Records.Query(
ctx,
onspring.QueryRecordsRequest{
AppId: surveyId,
Filter: filter,
FieldIds: []int{textFieldId},
DataFormat: "Formatted",
},
onspring.ForPageNumber(1),
onspring.WithPageSize(1),
)
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
if page.PageNumber != 1 {
t.Errorf("Expected page number 1, got %d", page.PageNumber)
}
if page.PageSize != 1 {
t.Errorf("Expected page size 1, got %d", page.PageSize)
}
if len(page.Items) != 1 {
t.Errorf("Expected 1 item, got %d", len(page.Items))
}
})
t.Run("should return a 400 error if page size is invalid", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
autoNumberField := requireEnvInt(t, "TEST_SURVEY_AUTO_NUMBER_FIELD")
filter := fmt.Sprintf("%d gt 0", autoNumberField)
_, err := client.Records.Query(
ctx,
onspring.QueryRecordsRequest{
AppId: surveyId,
Filter: filter,
},
onspring.WithPageSize(1001),
)
assertAPIError(t, err, http.StatusBadRequest)
})
t.Run("should return a 401 error if the API key is invalid", func(t *testing.T) {
invalidClient := createInvalidClient(t)
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
autoNumberField := requireEnvInt(t, "TEST_SURVEY_AUTO_NUMBER_FIELD")
filter := fmt.Sprintf("%d gt 0", autoNumberField)
_, err := invalidClient.Records.Query(ctx, onspring.QueryRecordsRequest{
AppId: surveyId,
Filter: filter,
})
assertAPIError(t, err, http.StatusUnauthorized)
})
t.Run("should return a 403 error if the API key does not have access to the app", func(t *testing.T) {
appIdNoAccess := requireEnvInt(t, "TEST_APP_ID_NO_ACCESS")
autoNumberField := requireEnvInt(t, "TEST_SURVEY_AUTO_NUMBER_FIELD")
filter := fmt.Sprintf("%d gt 0", autoNumberField)
_, err := client.Records.Query(ctx, onspring.QueryRecordsRequest{
AppId: appIdNoAccess,
Filter: filter,
})
assertAPIError(t, err, http.StatusForbidden)
})
})
t.Run("QueryAll", func(t *testing.T) {
t.Run("should iterate all records matching a query", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
autoNumberField := requireEnvInt(t, "TEST_SURVEY_AUTO_NUMBER_FIELD")
filter := fmt.Sprintf("%d gt 0", autoNumberField)
var records []onspring.Record
for record, err := range client.Records.QueryAll(
ctx,
onspring.QueryRecordsRequest{
AppId: surveyId,
Filter: filter,
},
onspring.WithPageSize(1),
) {
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
records = append(records, record)
}
if len(records) == 0 {
t.Error("Expected to iterate at least one record")
}
})
})
t.Run("Save", func(t *testing.T) {
t.Run("should add a record when no record id is passed", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
textFieldId := requireEnvInt(t, "TEST_TEXT_FIELD")
response, err := client.Records.Save(ctx, onspring.SaveRecordRequest{
AppId: surveyId,
Fields: map[string]any{
fmt.Sprintf("%d", textFieldId): "integration test record",
},
})
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
if response.Id == 0 {
t.Error("Expected record id to not be zero")
}
if response.Warnings == nil {
t.Error("Expected warnings to not be nil")
}
t.Cleanup(func() {
_ = client.Records.Delete(context.Background(), surveyId, response.Id)
})
})
t.Run("should update a record when a record id is passed", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
textFieldId := requireEnvInt(t, "TEST_TEXT_FIELD")
recordId := addTestRecord(t, client, surveyId, textFieldId)
response, err := client.Records.Save(ctx, onspring.SaveRecordRequest{
AppId: surveyId,
RecordId: &recordId,
Fields: map[string]any{
fmt.Sprintf("%d", textFieldId): "updated integration test record",
},
})
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
if response.Id == 0 {
t.Error("Expected record id to not be zero")
}
})
t.Run("should return a 400 error when field data is empty", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
_, err := client.Records.Save(ctx, onspring.SaveRecordRequest{
AppId: surveyId,
Fields: map[string]any{},
})
assertAPIError(t, err, http.StatusBadRequest)
})
t.Run("should return a 401 error when the api key is invalid", func(t *testing.T) {
invalidClient := createInvalidClient(t)
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
textFieldId := requireEnvInt(t, "TEST_TEXT_FIELD")
_, err := invalidClient.Records.Save(ctx, onspring.SaveRecordRequest{
AppId: surveyId,
Fields: map[string]any{
fmt.Sprintf("%d", textFieldId): "test",
},
})
assertAPIError(t, err, http.StatusUnauthorized)
})
t.Run("should return a 403 error when the api key does not have access to the app", func(t *testing.T) {
appIdNoAccess := requireEnvInt(t, "TEST_APP_ID_NO_ACCESS")
textFieldId := requireEnvInt(t, "TEST_TEXT_FIELD")
_, err := client.Records.Save(ctx, onspring.SaveRecordRequest{
AppId: appIdNoAccess,
Fields: map[string]any{
fmt.Sprintf("%d", textFieldId): "test",
},
})
assertAPIError(t, err, http.StatusForbidden)
})
t.Run("should return a 404 error when the record id is not found", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
textFieldId := requireEnvInt(t, "TEST_TEXT_FIELD")
recordId := 0
_, err := client.Records.Save(ctx, onspring.SaveRecordRequest{
AppId: surveyId,
RecordId: &recordId,
Fields: map[string]any{
fmt.Sprintf("%d", textFieldId): "test",
},
})
assertAPIError(t, err, http.StatusNotFound)
})
})
t.Run("Delete", func(t *testing.T) {
t.Run("should delete a record", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
textFieldId := requireEnvInt(t, "TEST_TEXT_FIELD")
recordId := addTestRecord(t, client, surveyId, textFieldId)
err := client.Records.Delete(ctx, surveyId, recordId)
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
})
t.Run("should return a 401 error when the API key is invalid", func(t *testing.T) {
invalidClient := createInvalidClient(t)
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
recordId := requireEnvInt(t, "TEST_SURVEY_RECORD_ID")
err := invalidClient.Records.Delete(ctx, surveyId, recordId)
assertAPIError(t, err, http.StatusUnauthorized)
})
t.Run("should return a 403 error when the API key does not have access to the app", func(t *testing.T) {
appIdNoAccess := requireEnvInt(t, "TEST_APP_ID_NO_ACCESS")
recordId := requireEnvInt(t, "TEST_SURVEY_RECORD_ID")
err := client.Records.Delete(ctx, appIdNoAccess, recordId)
assertAPIError(t, err, http.StatusForbidden)
})
t.Run("should return a 404 error when the record does not exist", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
err := client.Records.Delete(ctx, surveyId, 0)
assertAPIError(t, err, http.StatusNotFound)
})
})
t.Run("DeleteMany", func(t *testing.T) {
t.Run("should delete records", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
textFieldId := requireEnvInt(t, "TEST_TEXT_FIELD")
recordId1 := addTestRecord(t, client, surveyId, textFieldId)
recordId2 := addTestRecord(t, client, surveyId, textFieldId)
err := client.Records.DeleteMany(ctx, onspring.DeleteManyRecordsRequest{
AppId: surveyId,
RecordIds: []int{recordId1, recordId2},
})
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
})
t.Run("should return a 400 error when no record ids are provided", func(t *testing.T) {
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
err := client.Records.DeleteMany(ctx, onspring.DeleteManyRecordsRequest{
AppId: surveyId,
RecordIds: []int{},
})
assertAPIError(t, err, http.StatusBadRequest)
})
t.Run("should return a 401 error when an invalid API key is used", func(t *testing.T) {
invalidClient := createInvalidClient(t)
surveyId := requireEnvInt(t, "TEST_SURVEY_ID")
err := invalidClient.Records.DeleteMany(ctx, onspring.DeleteManyRecordsRequest{
AppId: surveyId,
RecordIds: []int{1},
})
assertAPIError(t, err, http.StatusUnauthorized)
})
t.Run("should return a 403 error when the API key does not have access to the app", func(t *testing.T) {
appIdNoAccess := requireEnvInt(t, "TEST_APP_ID_NO_ACCESS")
err := client.Records.DeleteMany(ctx, onspring.DeleteManyRecordsRequest{
AppId: appIdNoAccess,
RecordIds: []int{1},
})
assertAPIError(t, err, http.StatusForbidden)
})
})
}