<commit_before>package aws

import (
	"fmt"
	"testing"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awserr"
	"github.com/aws/aws-sdk-go/service/opsworks"
	"github.com/hashicorp/terraform/helper/resource"
	"github.com/hashicorp/terraform/terraform"
)

func TestAccAWSOpsworksApplication(t *testing.T) {
	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheck(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckAwsOpsworksApplicationDestroy,
		Steps: []resource.TestStep{
			resource.TestStep{
				Config: testAccAwsOpsworksApplicationCreate,
				Check: resource.ComposeTestCheckFunc(
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "name", "tf-ops-acc-application",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "type", "other",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "enable_ssl", "false",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "ssl_configuration", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "domains", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.key", "key1",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.value", "value1",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.secret", "",
					),
				),
			},
			resource.TestStep{
				Config: testAccAwsOpsworksApplicationUpdate,
				Check: resource.ComposeTestCheckFunc(
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "name", "tf-ops-acc-application",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "type", "rails",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "enable_ssl", "true",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "ssl_configuration.0.certificate", "-----BEGIN CERTIFICATE-----\nMIIBkDCB+gIJALoScFD0sJq3MA0GCSqGSIb3DQEBBQUAMA0xCzAJBgNVBAYTAkRF\nMB4XDTE1MTIxOTIwMzU1MVoXDTE2MDExODIwMzU1MVowDTELMAkGA1UEBhMCREUw\ngZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKKQKbTTH/Julz16xY7ArYlzJYCP\nedTCx1bopuryCx/+d1gC94MtRdlPSpQl8mfc9iBdtXbJppp73Qh/DzLzO9Ns25xZ\n+kUQMhbIyLsaCBzuEGLgAaVdGpNvRBw++UoYtd0U7QczFAreTGLH8n8+FIzuI5Mc\n+MJ1TKbbt5gFfRSzAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEALARo96wCDmaHKCaX\nS0IGLGnZCfiIUfCmBxOXBSJxDBwter95QHR0dMGxYIujee5n4vvavpVsqZnfMC3I\nOZWPlwiUJbNIpK+04Bg2vd5m/NMMrvi75RfmyeMtSfq/NrIX2Q3+nyWI7DLq7yZI\nV/YEvOqdAiy5NEWBztHx8HvB9G4=\n-----END CERTIFICATE-----",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "ssl_configuration.0.private_key", "-----<KEY>",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "domains.0", "example.com",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "domains.1", "sub.example.com",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.password", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.revision", "master",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.ssh_key", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.type", "git",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.url", "https://github.com/aws/example.git",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.username", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.2107898637.key", "key2",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.2107898637.value", "value2",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.2107898637.secure", "true",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.key", "key1",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.value", "value1",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.secret", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "document_root", "root",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "auto_bundle_on_deploy", "true",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "rails_env", "staging",
					),
				),
			},
		},
	})
}

func testAccCheckAwsOpsworksApplicationDestroy(s *terraform.State) error {
	client := testAccProvider.Meta().(*AWSClient).opsworksconn

	for _, rs := range s.RootModule().Resources {
		if rs.Type != "aws_opsworks_application" {
			continue
		}

		req := &opsworks.DescribeAppsInput{
			AppIds: []*string{
				aws.String(rs.Primary.ID),
			},
		}

		resp, err := client.DescribeApps(req)
		if err == nil {
			if len(resp.Apps) > 0 {
				return fmt.Errorf("OpsWorks App still exist.")
			}
		}

		if awserr, ok := err.(awserr.Error); ok {
			if awserr.Code() != "ResourceNotFoundException" {
				return err
			}
		}
	}

	return nil
}

var testAccAwsOpsworksApplicationCreate = testAccAwsOpsworksStackConfigNoVpcCreate("") + `
resource "aws_opsworks_application" "tf-acc-app" {
  stack_id = "${aws_opsworks_stack.tf-acc.id}"
  name = "tf-ops-acc-application"
  type = "other"
  enable_ssl = false
  app_source ={
    type = "other"
  }
	environment = { key = "key1" value = "value1" secure = false}
}
`

var testAccAwsOpsworksApplicationUpdate = testAccAwsOpsworksStackConfigNoVpcCreate("") + `
resource "aws_opsworks_application" "tf-acc-app" {
  stack_id = "${aws_opsworks_stack.tf-acc.id}"
  name = "tf-ops-acc-application"
  type = "rails"
  domains = ["example.com", "sub.example.com"]
  enable_ssl = true
  ssl_configuration = {
    private_key = <<EOS
-----<KEY>
EOS
    certificate = <<EOS
-----BEGIN CERTIFICATE-----
<KEY>
-----END CERTIFICATE-----
EOS
  }
  app_source = {
    type = "git"
    revision = "master"
    url = "https://github.com/aws/example.git"
  }
	environment = { key = "key1" value = "value1" secure = false}
	environment = { key = "key2" value = "value2" }
	document_root = "root"
  auto_bundle_on_deploy = "true"
  rails_env = "staging"
}
`
<commit_msg>Fix aws_opsworks_application acctest by passing in stack name<commit_after>package aws

import (
	"fmt"
	"testing"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awserr"
	"github.com/aws/aws-sdk-go/service/opsworks"
	"github.com/hashicorp/terraform/helper/resource"
	"github.com/hashicorp/terraform/terraform"
)

func TestAccAWSOpsworksApplication(t *testing.T) {
	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheck(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckAwsOpsworksApplicationDestroy,
		Steps: []resource.TestStep{
			resource.TestStep{
				Config: testAccAwsOpsworksApplicationCreate,
				Check: resource.ComposeTestCheckFunc(
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "name", "tf-ops-acc-application",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "type", "other",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "enable_ssl", "false",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "ssl_configuration", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "domains", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.key", "key1",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.value", "value1",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.secret", "",
					),
				),
			},
			resource.TestStep{
				Config: testAccAwsOpsworksApplicationUpdate,
				Check: resource.ComposeTestCheckFunc(
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "name", "tf-ops-acc-application",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "type", "rails",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "enable_ssl", "true",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "ssl_configuration.0.certificate", "-----<KEY>END CERTIFICATE-----",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "ssl_configuration.0.private_key", "-----<KEY>",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "domains.0", "example.com",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "domains.1", "sub.example.com",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.password", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.revision", "master",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.ssh_key", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.type", "git",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.url", "https://github.com/aws/example.git",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "app_source.0.username", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.2107898637.key", "key2",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.2107898637.value", "value2",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.2107898637.secure", "true",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.key", "key1",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.value", "value1",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "environment.3077298702.secret", "",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "document_root", "root",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "auto_bundle_on_deploy", "true",
					),
					resource.TestCheckResourceAttr(
						"aws_opsworks_application.tf-acc-app", "rails_env", "staging",
					),
				),
			},
		},
	})
}

func testAccCheckAwsOpsworksApplicationDestroy(s *terraform.State) error {
	client := testAccProvider.Meta().(*AWSClient).opsworksconn

	for _, rs := range s.RootModule().Resources {
		if rs.Type != "aws_opsworks_application" {
			continue
		}

		req := &opsworks.DescribeAppsInput{
			AppIds: []*string{
				aws.String(rs.Primary.ID),
			},
		}

		resp, err := client.DescribeApps(req)
		if err == nil {
			if len(resp.Apps) > 0 {
				return fmt.Errorf("OpsWorks App still exist.")
			}
		}

		if awserr, ok := err.(awserr.Error); ok {
			if awserr.Code() != "ResourceNotFoundException" {
				return err
			}
		}
	}

	return nil
}

var testAccAwsOpsworksApplicationCreate = testAccAwsOpsworksStackConfigNoVpcCreate("tf-ops-acc-application") + `
resource "aws_opsworks_application" "tf-acc-app" {
  stack_id = "${aws_opsworks_stack.tf-acc.id}"
  name = "tf-ops-acc-application"
  type = "other"
  enable_ssl = false
  app_source ={
    type = "other"
  }
	environment = { key = "key1" value = "value1" secure = false}
}
`

var testAccAwsOpsworksApplicationUpdate = testAccAwsOpsworksStackConfigNoVpcCreate("tf-ops-acc-application") + `
resource "aws_opsworks_application" "tf-acc-app" {
  stack_id = "${aws_opsworks_stack.tf-acc.id}"
  name = "tf-ops-acc-application"
  type = "rails"
  domains = ["example.com", "sub.example.com"]
  enable_ssl = true
  ssl_configuration = {
    private_key = <<EOS
-----<KEY>
EOS
    certificate = <<EOS
-----BEGIN CERTIFICATE-----
<KEY>END CERTIFICATE-----
EOS
  }
  app_source = {
    type = "git"
    revision = "master"
    url = "https://github.com/aws/example.git"
  }
	environment = { key = "key1" value = "value1" secure = false}
	environment = { key = "key2" value = "value2" }
	document_root = "root"
  auto_bundle_on_deploy = "true"
  rails_env = "staging"
}
`

{'fraction_non_alphanumeric': 0.1428040440083259, 'fraction_numerical': 0.02103776390127862, 'mean_word_length': 3.792661204132526, 'pattern_counts': {'":': 0, '<': 18, '<?xml version=': 0, '>': 12, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1202327', 'n_tokens_mistral': 5871, 'n_tokens_neox': 4843, 'n_words': 557}