/*
 * Portions copyright 2019-present Open Networking Foundation
 * Original copyright 2019-present Ciena Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "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"
	"github.com/opencord/cordctl/testutils"
	"testing"
)

func TestModelTypeList(t *testing.T) {
	// use `python -m json.tool` to pretty-print json
	expected := `AddressPool
AttWorkflowDriverService
AttWorkflowDriverServiceInstance
AttWorkflowDriverWhiteListEntry
BNGPortMapping
BackupFile
BackupOperation
BandwidthProfile
ComputeServiceInstance
FabricCrossconnectService
FabricCrossconnectServiceInstance
FabricIpAddress
FabricService
Flavor
Image
InterfaceType
KubernetesConfigMap
KubernetesConfigVolumeMount
KubernetesData
KubernetesResourceInstance
KubernetesSecret
KubernetesSecretVolumeMount
KubernetesService
KubernetesServiceInstance
NNIPort
Network
NetworkParameter
NetworkParameterType
NetworkSlice
NetworkTemplate
Node
NodeLabel
NodeToSwitchPort
OLTDevice
ONOSApp
ONOSService
ONUDevice
PONONUPort
PONPort
Port
PortBase
PortInterface
Principal
Privilege
RCORDIpAddress
RCORDService
RCORDSubscriber
Role
Service
ServiceAttribute
ServiceDependency
ServiceGraphConstraint
ServiceInstance
ServiceInstanceAttribute
ServiceInstanceLink
ServiceInterface
ServicePort
Site
Slice
Switch
SwitchPort
Tag
TrustDomain
UNIPort
User
VOLTService
VOLTServiceInstance
XOSCore
XOSGuiExtension
`

	got := new(bytes.Buffer)
	OutputStream = got

	var options ModelTypeOpts
	err := options.List.Execute([]string{})

	if err != nil {
		t.Errorf("%s: Received error %v", t.Name(), err)
		return
	}

	testutils.AssertStringEqual(t, got.String(), expected)
}
