| /* |
| * Portions copyright 2019-present Open Networking Foundation |
| * Original copyright 2019-present Ciena Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the"github.com/stretchr/testify/assert" "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package commands |
| |
| import ( |
| "bytes" |
| corderrors "github.com/opencord/cordctl/error" |
| "github.com/opencord/cordctl/testutils" |
| "github.com/stretchr/testify/assert" |
| "testing" |
| "time" |
| ) |
| |
| func TestModelList(t *testing.T) { |
| // use `python -m json.tool` to pretty-print json |
| expected := `[ |
| { |
| "controller_kind": "", |
| "controller_replica_count": 0, |
| "creator_id": 0, |
| "default_flavor_id": 0, |
| "default_image_id": 0, |
| "default_isolation": "", |
| "default_node_id": 0, |
| "description": "", |
| "enabled": false, |
| "exposed_ports": "", |
| "id": 1, |
| "max_instances": 0, |
| "mount_data_sets": "", |
| "name": "mockslice1", |
| "network": "", |
| "principal_id": 0, |
| "service_id": 0, |
| "site_id": 1, |
| "trust_domain_id": 0 |
| }, |
| { |
| "controller_kind": "", |
| "controller_replica_count": 0, |
| "creator_id": 0, |
| "default_flavor_id": 0, |
| "default_image_id": 0, |
| "default_isolation": "", |
| "default_node_id": 0, |
| "description": "", |
| "enabled": false, |
| "exposed_ports": "", |
| "id": 2, |
| "max_instances": 0, |
| "mount_data_sets": "", |
| "name": "mockslice2", |
| "network": "", |
| "principal_id": 0, |
| "service_id": 0, |
| "site_id": 1, |
| "trust_domain_id": 0 |
| } |
| ]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.List.Args.ModelName = "Slice" |
| options.List.OutputAs = "json" |
| err := options.List.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelListFilterID(t *testing.T) { |
| // use `python -m json.tool` to pretty-print json |
| expected := `[ |
| { |
| "controller_kind": "", |
| "controller_replica_count": 0, |
| "creator_id": 0, |
| "default_flavor_id": 0, |
| "default_image_id": 0, |
| "default_isolation": "", |
| "default_node_id": 0, |
| "description": "", |
| "enabled": false, |
| "exposed_ports": "", |
| "id": 1, |
| "max_instances": 0, |
| "mount_data_sets": "", |
| "name": "mockslice1", |
| "network": "", |
| "principal_id": 0, |
| "service_id": 0, |
| "site_id": 1, |
| "trust_domain_id": 0 |
| } |
| ]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.List.Args.ModelName = "Slice" |
| options.List.OutputAs = "json" |
| options.List.Filter = "id=1" |
| err := options.List.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelListFilterName(t *testing.T) { |
| // use `python -m json.tool` to pretty-print json |
| expected := `[ |
| { |
| "controller_kind": "", |
| "controller_replica_count": 0, |
| "creator_id": 0, |
| "default_flavor_id": 0, |
| "default_image_id": 0, |
| "default_isolation": "", |
| "default_node_id": 0, |
| "description": "", |
| "enabled": false, |
| "exposed_ports": "", |
| "id": 2, |
| "max_instances": 0, |
| "mount_data_sets": "", |
| "name": "mockslice2", |
| "network": "", |
| "principal_id": 0, |
| "service_id": 0, |
| "site_id": 1, |
| "trust_domain_id": 0 |
| } |
| ]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.List.Args.ModelName = "Slice" |
| options.List.OutputAs = "json" |
| options.List.Filter = "name=mockslice2" |
| err := options.List.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelListDirty(t *testing.T) { |
| // use `python -m json.tool` to pretty-print json |
| expected := `[ |
| { |
| "controller_kind": "", |
| "controller_replica_count": 0, |
| "creator_id": 0, |
| "default_flavor_id": 0, |
| "default_image_id": 0, |
| "default_isolation": "", |
| "default_node_id": 0, |
| "description": "", |
| "enabled": false, |
| "exposed_ports": "", |
| "id": 2, |
| "max_instances": 0, |
| "mount_data_sets": "", |
| "name": "mockslice2", |
| "network": "", |
| "principal_id": 0, |
| "service_id": 0, |
| "site_id": 1, |
| "trust_domain_id": 0 |
| } |
| ]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.List.Args.ModelName = "Slice" |
| options.List.OutputAs = "json" |
| options.List.State = "dirty" |
| err := options.List.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelUpdate(t *testing.T) { |
| expected := `[{"id":1, "message":"Updated"}]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.Update.Args.ModelName = "Slice" |
| options.Update.OutputAs = "json" |
| options.Update.IDArgs.ID = []int32{1} |
| options.Update.SetFields = "name=mockslice1_newname" |
| err := options.Update.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelUpdateUsingFilter(t *testing.T) { |
| expected := `[{"id":1, "message":"Updated"}]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.Update.Args.ModelName = "Slice" |
| options.Update.OutputAs = "json" |
| options.Update.Filter = "id=1" |
| options.Update.SetFields = "name=mockslice1_newname" |
| err := options.Update.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelUpdateNoExist(t *testing.T) { |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.Update.Args.ModelName = "Slice" |
| options.Update.OutputAs = "json" |
| options.Update.IDArgs.ID = []int32{77} |
| options.Update.SetFields = "name=mockslice1_newname" |
| err := options.Update.Execute([]string{}) |
| |
| _, matched := err.(*corderrors.ModelNotFoundError) |
| assert.True(t, matched) |
| } |
| |
| func TestModelUpdateUsingFilterNoExist(t *testing.T) { |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.Update.Args.ModelName = "Slice" |
| options.Update.OutputAs = "json" |
| options.Update.Filter = "id=77" |
| options.Update.SetFields = "name=mockslice1_newname" |
| err := options.Update.Execute([]string{}) |
| |
| _, matched := err.(*corderrors.NoMatchError) |
| assert.True(t, matched) |
| } |
| |
| func TestModelCreate(t *testing.T) { |
| expected := `[{"id":3, "message":"Created"}]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.Create.Args.ModelName = "Slice" |
| options.Create.OutputAs = "json" |
| options.Create.SetFields = "name=mockslice3,site_id=1" |
| err := options.Create.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelDelete(t *testing.T) { |
| expected := `[{"id":1, "message":"Deleted"}]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.Delete.Args.ModelName = "Slice" |
| options.Delete.OutputAs = "json" |
| options.Delete.IDArgs.ID = []int32{1} |
| err := options.Delete.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelDeleteUsingFilter(t *testing.T) { |
| expected := `[{"id":1, "message":"Deleted"}]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.Delete.Args.ModelName = "Slice" |
| options.Delete.OutputAs = "json" |
| options.Delete.Filter = "id=1" |
| err := options.Delete.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelDeleteNoExist(t *testing.T) { |
| expected := `[{"id":77, "message":"Not Found [on model Slice <id=77>]"}]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.Delete.Args.ModelName = "Slice" |
| options.Delete.OutputAs = "json" |
| options.Delete.IDArgs.ID = []int32{77} |
| err := options.Delete.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelDeleteFilterNoExist(t *testing.T) { |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.Delete.Args.ModelName = "Slice" |
| options.Delete.OutputAs = "json" |
| options.Delete.Filter = "id=77" |
| err := options.Delete.Execute([]string{}) |
| |
| _, matched := err.(*corderrors.NoMatchError) |
| assert.True(t, matched) |
| } |
| |
| func TestModelSync(t *testing.T) { |
| expected := `[{"id":1, "message":"Enacted"}]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.Sync.Args.ModelName = "Slice" |
| options.Sync.OutputAs = "json" |
| options.Sync.IDArgs.ID = []int32{1} |
| options.Sync.SyncTimeout = 5 * time.Second |
| err := options.Sync.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelSyncTimeout(t *testing.T) { |
| expected := `[{"id":2, "message":"context deadline exceeded"}]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.Sync.Args.ModelName = "Slice" |
| options.Sync.OutputAs = "json" |
| options.Sync.IDArgs.ID = []int32{2} |
| options.Sync.SyncTimeout = 5 * time.Second |
| err := options.Sync.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |
| |
| func TestModelSetDirty(t *testing.T) { |
| expected := `[{"id":1, "message":"Dirtied"}]` |
| |
| got := new(bytes.Buffer) |
| OutputStream = got |
| |
| var options ModelOpts |
| options.SetDirty.Args.ModelName = "Slice" |
| options.SetDirty.OutputAs = "json" |
| options.SetDirty.IDArgs.ID = []int32{1} |
| err := options.SetDirty.Execute([]string{}) |
| |
| if err != nil { |
| t.Errorf("%s: Received error %v", t.Name(), err) |
| return |
| } |
| |
| testutils.AssertJSONEqual(t, got.String(), expected) |
| } |