github.com/go-chef/chef@v0.30.1/role_test.go (about)

     1  package chef
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"github.com/r3labs/diff"
     7  	"github.com/stretchr/testify/assert"
     8  	"io"
     9  	"log"
    10  	"net/http"
    11  	"os"
    12  	"reflect"
    13  	"testing"
    14  )
    15  
    16  var (
    17  	testRoleJSON = "test/role.json"
    18  	// FML
    19  	testRole = &Role{
    20  		Name:               "test",
    21  		ChefType:           "role",
    22  		Description:        "Test Role",
    23  		RunList:            []string{"recipe[foo]", "recipe[baz]", "role[banana]"},
    24  		JsonClass:          "Chef::Role",
    25  		DefaultAttributes:  struct{}{},
    26  		OverrideAttributes: struct{}{},
    27  	}
    28  )
    29  
    30  func TestRoleName(t *testing.T) {
    31  	n1 := testRole
    32  	name := n1.Name
    33  	assert.Equal(t, "test", name, "Role name")
    34  }
    35  
    36  // BUG(fujin): re-do with goconvey
    37  func TestRoleFromJSONDecoder(t *testing.T) {
    38  	if file, err := os.Open(testRoleJSON); err != nil {
    39  		t.Error("unexpected error", err, "during os.Open on", testRoleJSON)
    40  	} else {
    41  		dec := json.NewDecoder(file)
    42  		var n Role
    43  		if err := dec.Decode(&n); err == io.EOF {
    44  			log.Println(n)
    45  		} else if err != nil {
    46  			log.Fatal(err)
    47  		}
    48  	}
    49  }
    50  
    51  func TestRolesService_List(t *testing.T) {
    52  	setup()
    53  	defer teardown()
    54  
    55  	mux.HandleFunc("/roles", func(w http.ResponseWriter, r *http.Request) {
    56  		fmt.Fprintf(w, `{"foo":"http://localhost:4000/roles/foo", "webserver":"http://localhost:4000/roles/webserver"}`)
    57  	})
    58  
    59  	roles, err := client.Roles.List()
    60  	if err != nil {
    61  		t.Errorf("Roles.List returned error: %v", err)
    62  	}
    63  
    64  	want := &RoleListResult{"foo": "http://localhost:4000/roles/foo", "webserver": "http://localhost:4000/roles/webserver"}
    65  
    66  	if !reflect.DeepEqual(roles, want) {
    67  		t.Errorf("Roles.List returned %+v, want %+v", roles, want)
    68  	}
    69  }
    70  
    71  func TestRolesService_Get(t *testing.T) {
    72  	setup()
    73  	defer teardown()
    74  
    75  	mux.HandleFunc("/roles/webserver", func(w http.ResponseWriter, r *http.Request) {
    76  		fmt.Fprintf(w, `{
    77  		  "name": "webserver",
    78  		  "chef_type": "role",
    79  		  "json_class": "Chef::Role",
    80  		  "default_attributes": "",
    81  		  "description": "A webserver",
    82  		  "run_list": [
    83  		    "recipe[unicorn]",
    84  		    "recipe[apache2]"
    85  		  ],
    86  		  "override_attributes": ""
    87  		}
    88  		`)
    89  	})
    90  
    91  	role, err := client.Roles.Get("webserver")
    92  	if err != nil {
    93  		t.Errorf("Roles.Get returned error: %v", err)
    94  	}
    95  
    96  	want := &Role{
    97  		Name:               "webserver",
    98  		ChefType:           "role",
    99  		JsonClass:          "Chef::Role",
   100  		DefaultAttributes:  "",
   101  		Description:        "A webserver",
   102  		RunList:            []string{"recipe[unicorn]", "recipe[apache2]"},
   103  		OverrideAttributes: "",
   104  	}
   105  
   106  	if !reflect.DeepEqual(role, want) {
   107  		t.Errorf("Roles.Get returned %+v, want %+v", role, want)
   108  	}
   109  }
   110  
   111  func TestRolesService_Create(t *testing.T) {
   112  	setup()
   113  	defer teardown()
   114  
   115  	mux.HandleFunc("/roles", func(w http.ResponseWriter, r *http.Request) {
   116  		fmt.Fprintf(w, `{ "uri": "http://localhost:4000/roles/webserver" }`)
   117  	})
   118  
   119  	role := &Role{
   120  		Name:               "webserver",
   121  		ChefType:           "role",
   122  		JsonClass:          "Chef::Role",
   123  		DefaultAttributes:  "",
   124  		Description:        "A webserver",
   125  		RunList:            []string{"recipe[unicorn]", "recipe[apache2]"},
   126  		OverrideAttributes: "",
   127  	}
   128  
   129  	uri, err := client.Roles.Create(role)
   130  	if err != nil {
   131  		t.Errorf("Roles.Create returned error: %v", err)
   132  	}
   133  
   134  	want := &RoleCreateResult{"uri": "http://localhost:4000/roles/webserver"}
   135  
   136  	if !reflect.DeepEqual(uri, want) {
   137  		t.Errorf("Roles.Create returned %+v, want %+v", uri, want)
   138  	}
   139  }
   140  
   141  func TestRolesService_Put(t *testing.T) {
   142  	setup()
   143  	defer teardown()
   144  
   145  	mux.HandleFunc("/roles/webserver", func(w http.ResponseWriter, r *http.Request) {
   146  		fmt.Fprintf(w, `{
   147  		  "name": "webserver",
   148  		  "chef_type": "role",
   149  		  "json_class": "Chef::Role",
   150  		  "description": "A webserver",
   151  		  "run_list": [
   152  		    "recipe[apache2]"
   153  		  ]
   154  		}`)
   155  	})
   156  
   157  	role := &Role{
   158  		Name:        "webserver",
   159  		ChefType:    "role",
   160  		JsonClass:   "Chef::Role",
   161  		Description: "A webserver",
   162  		RunList:     []string{"recipe[apache2]"},
   163  	}
   164  
   165  	updatedRole, err := client.Roles.Put(role)
   166  	if err != nil {
   167  		t.Errorf("Roles.Put returned error: %v", err)
   168  	}
   169  
   170  	if !reflect.DeepEqual(updatedRole, role) {
   171  		t.Errorf("Roles.Put returned %+v, want %+v", updatedRole, role)
   172  	}
   173  }
   174  
   175  func TestRolesService_GetEnvironments(t *testing.T) {
   176  	setup()
   177  	defer teardown()
   178  
   179  	mux.HandleFunc("/roles/webserver/environments", func(w http.ResponseWriter, r *http.Request) {
   180  		fmt.Fprintf(w, `[ "_default", "env1"]`)
   181  	})
   182  
   183  	want := RoleEnvironmentsResult{
   184  		"_default",
   185  		"env1",
   186  	}
   187  
   188  	updatedRole, err := client.Roles.GetEnvironments("webserver")
   189  	if err != nil {
   190  		t.Errorf("Roles.GetEnvironments returned error: %v", err)
   191  	}
   192  
   193  	if !reflect.DeepEqual(updatedRole, want) {
   194  		t.Errorf("Roles.GetEnvironments returned %+v, want %+v", updatedRole, want)
   195  	}
   196  }
   197  
   198  func TestRolesService_GetEnvironmentRunlist(t *testing.T) {
   199  	setup()
   200  	defer teardown()
   201  
   202  	mux.HandleFunc("/roles/webserver/environments/env1", func(w http.ResponseWriter, r *http.Request) {
   203  		fmt.Fprintf(w, `{"run_list": ["recipe[foo1]", "recipe[foo2]"]}`)
   204  	})
   205  
   206  	list := []string{"recipe[foo1]", "recipe[foo2]"}
   207  	want := map[string][]string{"run_list": list}
   208  
   209  	updatedRole, err := client.Roles.GetEnvironmentRunlist("webserver", "env1")
   210  	if err != nil {
   211  		t.Errorf("Roles.GetEnvironmentRunlist returned error: %v", err)
   212  	}
   213  
   214  	diff, err := diff.Diff(updatedRole, want)
   215  	if err != nil {
   216  		t.Errorf("Roles.GetEnvironmentRunlist returned %+v, want %+v", updatedRole, want)
   217  		t.Errorf("Diff  comparison %+v err %+v\n", diff, err)
   218  	}
   219  }
   220  
   221  func TestRolesService_RoleListResultString(t *testing.T) {
   222  	r := &RoleListResult{"foo": "http://localhost:4000/roles/foo"}
   223  	rstr := r.String()
   224  	want := "foo => http://localhost:4000/roles/foo\n"
   225  	if rstr != want {
   226  		t.Errorf("RoleListResult.String returned %+v, want %+v", rstr, want)
   227  	}
   228  }
   229  
   230  func TestRolesService_RoleCreateResultString(t *testing.T) {
   231  	r := &RoleCreateResult{"uri": "http://localhost:4000/roles/webserver"}
   232  	rstr := r.String()
   233  	want := "uri => http://localhost:4000/roles/webserver\n"
   234  	if rstr != want {
   235  		t.Errorf("RoleCreateResult.String returned %+v, want %+v", rstr, want)
   236  	}
   237  }
   238  
   239  func TestRolesService_Delete(t *testing.T) {
   240  	setup()
   241  	defer teardown()
   242  
   243  	mux.HandleFunc("/roles/webserver", func(w http.ResponseWriter, r *http.Request) {
   244  		fmt.Fprintf(w, `{
   245  		  "name": "webserver",
   246  		  "chef_type": "role",
   247  		  "json_class": "Chef::Role",
   248  		  "description": "A webserver",
   249  		  "run_list": [
   250  		    "recipe[apache2]"
   251  		  ]
   252  		}`)
   253  	})
   254  	err := client.Roles.Delete("webserver")
   255  	if err != nil {
   256  		t.Errorf("Roles.Delete returned error: %v", err)
   257  	}
   258  }