Skip to content

Commit

Permalink
feat: allow for optional file upload field
Browse files Browse the repository at this point in the history
Signed-off-by: Sarah Funkhouser <147884153+golanglemonade@users.noreply.github.com>
  • Loading branch information
golanglemonade committed Oct 15, 2024
1 parent b7b4ce0 commit 5203da0
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 8 deletions.
20 changes: 20 additions & 0 deletions clientv2/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,26 @@ func parseMultipartFiles(
},
})

i++
case *graphql.Upload:
// continue if it is empty
if item == nil {
continue
}

iStr := strconv.Itoa(i)
vars[k] = nil
mapping[iStr] = []string{fmt.Sprintf("variables.%s", k)}

multipartFilesGroups = append(multipartFilesGroups, MultipartFilesGroup{
Files: []MultipartFile{
{
Index: i,
File: *item,
},
},
})

i++
case []*graphql.Upload:
vars[k] = make([]struct{}, len(item))
Expand Down
67 changes: 59 additions & 8 deletions clientv2/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -382,8 +382,8 @@ func Test_parseMultipartFiles(t *testing.T) {

require.Contains(t, varsMutated, "field")
require.Contains(t, varsMutated, "field2")
require.Equal(t, len(mapping), 0)
require.Equal(t, len(multipartFilesGroups), 0)
require.Len(t, mapping, 0)
require.Len(t, multipartFilesGroups, 0)
})

t.Run("has file in vars", func(t *testing.T) {
Expand All @@ -407,10 +407,61 @@ func Test_parseMultipartFiles(t *testing.T) {
t.Fatal("fieldFile must present!")
}

require.Equal(t, len(mapping), 1)
require.Equal(t, len(multipartFilesGroups), 1)
require.Len(t, mapping, 1)
require.Len(t, multipartFilesGroups, 1)
require.Equal(t, multipartFilesGroups[0].IsMultiple, false)
require.Equal(t, len(multipartFilesGroups[0].Files), 1)
require.Len(t, multipartFilesGroups[0].Files, 1)
require.Nil(t, fieldFile)
})

t.Run("has optional file in vars", func(t *testing.T) {
t.Parallel()

vars := map[string]any{
"field": "val",
"fieldFile": &graphql.Upload{
Filename: "file.txt",
File: bytes.NewReader([]byte("content")),
},
}

multipartFilesGroups, mapping, varsMutated := parseMultipartFiles(vars)

require.Contains(t, varsMutated, "field")
require.Contains(t, varsMutated, "fieldFile")

fieldFile, ok := varsMutated["fieldFile"]
if !ok {
t.Fatal("fieldFile must present!")
}

require.Len(t, mapping, 1)
require.Len(t, multipartFilesGroups, 1)
require.Equal(t, multipartFilesGroups[0].IsMultiple, false)
require.Len(t, multipartFilesGroups[0].Files, 1)
require.Nil(t, fieldFile)
})

t.Run("has no optional file in vars", func(t *testing.T) {
t.Parallel()

vars := map[string]any{
"field": "val",
"fieldFile": nil,
}

multipartFilesGroups, mapping, varsMutated := parseMultipartFiles(vars)

require.Contains(t, varsMutated, "field")
require.Contains(t, varsMutated, "fieldFile")

fieldFile, ok := varsMutated["fieldFile"]
if !ok {
t.Fatal("fieldFile must present!")
}

require.Len(t, mapping, 0)
require.Len(t, multipartFilesGroups, 0)
require.Nil(t, fieldFile)
})

Expand Down Expand Up @@ -441,10 +492,10 @@ func Test_parseMultipartFiles(t *testing.T) {
t.Fatal("fieldFile must present!")
}

require.Equal(t, len(mapping), 2)
require.Equal(t, len(multipartFilesGroups), 1)
require.Len(t, mapping, 2)
require.Len(t, multipartFilesGroups, 1)
require.Equal(t, multipartFilesGroups[0].IsMultiple, true)
require.Equal(t, len(multipartFilesGroups[0].Files), 2)
require.Len(t, multipartFilesGroups[0].Files, 2)
require.ElementsMatch(t, fieldFiles, make([]struct{}, 2))
})
}
Expand Down

0 comments on commit 5203da0

Please sign in to comment.