• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

UiPath / uipathcli / 22831114088

08 Mar 2026 10:15PM UTC coverage: 90.511% (-0.4%) from 90.914%
22831114088

Pull #212

github

Chibi Vikram
Fix studio_client_test.go: set MaxAttempts to 1 to prevent retry loop

The network HTTP client retries on 500 status codes. With MaxAttempts=0
(the default for empty ExecutionSettings), the retry logic closes the
response body and returns a nil error, causing "read on closed response
body" errors. Setting MaxAttempts=1 matches the intended test behavior.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pull Request #212: Add studio solution commands, skill, and agents.md

580 of 674 new or added lines in 16 files covered. (86.05%)

3 existing lines in 1 file now uncovered.

7354 of 8125 relevant lines covered (90.51%)

1.02 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.73
/plugin/studio/solution/push/solution_push_command.go
1
// Package push implements the command plugin for pushing a .uis solution
2
// file to UiPath Studio Web.
3
package push
4

5
import (
6
        "bytes"
7
        "encoding/json"
8
        "errors"
9
        "fmt"
10
        "net/http"
11
        "os"
12
        "path/filepath"
13

14
        "github.com/UiPath/uipathcli/log"
15
        "github.com/UiPath/uipathcli/output"
16
        "github.com/UiPath/uipathcli/plugin"
17
        "github.com/UiPath/uipathcli/utils/api"
18
        "github.com/UiPath/uipathcli/utils/stream"
19
        "github.com/UiPath/uipathcli/utils/visualization"
20
)
21

22
// The SolutionPushCommand pushes a .uis file to Studio Web.
23
type SolutionPushCommand struct{}
24

25
func (c SolutionPushCommand) Command() plugin.Command {
1✔
26
        return *plugin.NewCommand("studio").
1✔
27
                WithCategory("solution", "UiPath Solution management", "Pack, unpack, push and pull UiPath Maestro solutions.").
1✔
28
                WithOperation("push", "Push Solution", "Pushes a .uis solution file to UiPath Studio Web").
1✔
29
                WithParameter(plugin.NewParameter("source", plugin.ParameterTypeString, "Path to .uis file").
1✔
30
                        WithRequired(true)).
1✔
31
                WithParameter(plugin.NewParameter("solution-id", plugin.ParameterTypeString, "Solution ID to update (optional, for updating existing solutions)").
1✔
32
                        WithDefaultValue(""))
1✔
33
}
1✔
34

35
func (c SolutionPushCommand) Execute(ctx plugin.ExecutionContext, writer output.OutputWriter, logger log.Logger) error {
1✔
36
        if ctx.Organization == "" {
2✔
37
                return errors.New("Organization is not set")
1✔
38
        }
1✔
39
        source := c.getStringParameter("source", "", ctx.Parameters)
1✔
40
        if source == "" {
1✔
NEW
41
                return errors.New("Source .uis file is required")
×
NEW
42
        }
×
43
        source, _ = filepath.Abs(source)
1✔
44
        solutionId := c.getStringParameter("solution-id", "", ctx.Parameters)
1✔
45

1✔
46
        if _, err := os.Stat(source); err != nil {
2✔
47
                return fmt.Errorf("File not found: %s", source)
1✔
48
        }
1✔
49

50
        params := newSolutionPushParams(source, solutionId, ctx.BaseUri, ctx.Organization, ctx.Auth, ctx.Debug, ctx.Settings)
1✔
51
        result, err := c.push(*params, logger)
1✔
52
        if err != nil {
2✔
53
                return err
1✔
54
        }
1✔
55

56
        jsonData, err := json.Marshal(result)
1✔
57
        if err != nil {
1✔
NEW
58
                return fmt.Errorf("Push command failed: %w", err)
×
NEW
59
        }
×
60
        return writer.WriteResponse(*output.NewResponseInfo(http.StatusOK, "200 OK", "HTTP/1.1", map[string][]string{}, bytes.NewReader(jsonData)))
1✔
61
}
62

63
func (c SolutionPushCommand) push(params solutionPushParams, logger log.Logger) (*solutionPushResult, error) {
1✔
64
        file := stream.NewFileStream(params.Source)
1✔
65
        uploadBar := visualization.NewProgressBar(logger)
1✔
66
        defer uploadBar.Remove()
1✔
67

1✔
68
        client := api.NewStudioClient(params.BaseUri, params.Organization, params.Auth.Token, params.Debug, params.Settings, logger)
1✔
69
        response, err := client.PushSolution(file, params.SolutionId, uploadBar)
1✔
70
        if err != nil {
2✔
71
                return nil, err
1✔
72
        }
1✔
73

74
        return newSucceededSolutionPushResult(params.Source, response.SolutionId), nil
1✔
75
}
76

77
func (c SolutionPushCommand) getStringParameter(name string, defaultValue string, parameters []plugin.ExecutionParameter) string {
1✔
78
        result := defaultValue
1✔
79
        for _, p := range parameters {
2✔
80
                if p.Name == name {
2✔
81
                        if data, ok := p.Value.(string); ok {
2✔
82
                                result = data
1✔
83
                                break
1✔
84
                        }
85
                }
86
        }
87
        return result
1✔
88
}
89

90
func NewSolutionPushCommand() *SolutionPushCommand {
1✔
91
        return &SolutionPushCommand{}
1✔
92
}
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc