testwithgo.com
Open in
urlscan Pro
3.75.10.80
Public Scan
Submitted URL: http://testwithgo.com/
Effective URL: https://testwithgo.com/
Submission: On November 03 via api from US — Scanned from DE
Effective URL: https://testwithgo.com/
Submission: On November 03 via api from US — Scanned from DE
Form analysis
1 forms found in the DOMPOST https://app.kit.com/forms/1469048/subscriptions
<form action="https://app.kit.com/forms/1469048/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="1469048" data-uid="96680ccf0e" data-format="inline" data-version="5" min-width="400">
<div data-style="clean">
<ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul>
<div data-element="fields" data-stacked="false" class="seva-fields formkit-fields">
<div class="formkit-field"><input type="text" class="formkit-input" name="email_address" style="color:#000;border-color:#e3e3e3;border-radius:4px;font-weight:400" aria-label="Your email address" placeholder="Your email address" required="">
</div><button data-element="submit" class="formkit-submit formkit-submit" style="color:#1c3d5a;background-color:#fff213;border-radius:4px;font-weight:700">
<div class="formkit-spinner">
<div></div>
<div></div>
<div></div>
</div><span class=""> REQUEST A SAMPLE </span>
</button>
</div>
</div>
<style>
.formkit-form[data-uid="96680ccf0e"] * {
box-sizing: border-box;
}
.formkit-form[data-uid="96680ccf0e"] {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.formkit-form[data-uid="96680ccf0e"] legend {
border: none;
font-size: inherit;
margin-bottom: 10px;
padding: 0;
position: relative;
display: table;
}
.formkit-form[data-uid="96680ccf0e"] fieldset {
border: 0;
padding: 0.01em 0 0 0;
margin: 0;
min-width: 0;
}
.formkit-form[data-uid="96680ccf0e"] body:not(:-moz-handler-blocked) fieldset {
display: table-cell;
}
.formkit-form[data-uid="96680ccf0e"] h1,
.formkit-form[data-uid="96680ccf0e"] h2,
.formkit-form[data-uid="96680ccf0e"] h3,
.formkit-form[data-uid="96680ccf0e"] h4,
.formkit-form[data-uid="96680ccf0e"] h5,
.formkit-form[data-uid="96680ccf0e"] h6 {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="96680ccf0e"] h2 {
font-size: 1.5em;
margin: 1em 0;
}
.formkit-form[data-uid="96680ccf0e"] h3 {
font-size: 1.17em;
margin: 1em 0;
}
.formkit-form[data-uid="96680ccf0e"] p {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="96680ccf0e"] ol:not([template-default]),
.formkit-form[data-uid="96680ccf0e"] ul:not([template-default]),
.formkit-form[data-uid="96680ccf0e"] blockquote:not([template-default]) {
text-align: left;
}
.formkit-form[data-uid="96680ccf0e"] p:not([template-default]),
.formkit-form[data-uid="96680ccf0e"] hr:not([template-default]),
.formkit-form[data-uid="96680ccf0e"] blockquote:not([template-default]),
.formkit-form[data-uid="96680ccf0e"] ol:not([template-default]),
.formkit-form[data-uid="96680ccf0e"] ul:not([template-default]) {
color: inherit;
font-style: initial;
}
.formkit-form[data-uid="96680ccf0e"] .ordered-list,
.formkit-form[data-uid="96680ccf0e"] .unordered-list {
list-style-position: outside !important;
padding-left: 1em;
}
.formkit-form[data-uid="96680ccf0e"] .list-item {
padding-left: 0;
}
.formkit-form[data-uid="96680ccf0e"][data-format="modal"] {
display: none;
}
.formkit-form[data-uid="96680ccf0e"][data-format="slide in"] {
display: none;
}
.formkit-form[data-uid="96680ccf0e"][data-format="sticky bar"] {
display: none;
}
.formkit-sticky-bar .formkit-form[data-uid="96680ccf0e"][data-format="sticky bar"] {
display: block;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-input,
.formkit-form[data-uid="96680ccf0e"] .formkit-select,
.formkit-form[data-uid="96680ccf0e"] .formkit-checkboxes {
width: 100%;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-button,
.formkit-form[data-uid="96680ccf0e"] .formkit-submit {
border: 0;
border-radius: 5px;
color: #ffffff;
cursor: pointer;
display: inline-block;
text-align: center;
font-size: 15px;
font-weight: 500;
cursor: pointer;
margin-bottom: 15px;
overflow: hidden;
padding: 0;
position: relative;
vertical-align: middle;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-button:hover,
.formkit-form[data-uid="96680ccf0e"] .formkit-submit:hover,
.formkit-form[data-uid="96680ccf0e"] .formkit-button:focus,
.formkit-form[data-uid="96680ccf0e"] .formkit-submit:focus {
outline: none;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-button:hover>span,
.formkit-form[data-uid="96680ccf0e"] .formkit-submit:hover>span,
.formkit-form[data-uid="96680ccf0e"] .formkit-button:focus>span,
.formkit-form[data-uid="96680ccf0e"] .formkit-submit:focus>span {
background-color: rgba(0, 0, 0, 0.1);
}
.formkit-form[data-uid="96680ccf0e"] .formkit-button>span,
.formkit-form[data-uid="96680ccf0e"] .formkit-submit>span {
display: block;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
padding: 12px 24px;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-input {
background: #ffffff;
font-size: 15px;
padding: 12px;
border: 1px solid #e3e3e3;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
line-height: 1.4;
margin: 0;
-webkit-transition: border-color ease-out 300ms;
transition: border-color ease-out 300ms;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-input:focus {
outline: none;
border-color: #1677be;
-webkit-transition: border-color ease 300ms;
transition: border-color ease 300ms;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-input::-webkit-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-input::-moz-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-input:-ms-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-input::placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="dropdown"] {
position: relative;
display: inline-block;
width: 100%;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="dropdown"]::before {
content: "";
top: calc(50% - 2.5px);
right: 10px;
position: absolute;
pointer-events: none;
border-color: #4f4f4f transparent transparent transparent;
border-style: solid;
border-width: 6px 6px 0 6px;
height: 0;
width: 0;
z-index: 999;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="dropdown"] select {
height: auto;
width: 100%;
cursor: pointer;
color: #333333;
line-height: 1.4;
margin-bottom: 0;
padding: 0 6px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
font-size: 15px;
padding: 12px;
padding-right: 25px;
border: 1px solid #e3e3e3;
background: #ffffff;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="dropdown"] select:focus {
outline: none;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] {
text-align: left;
margin: 0;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] {
margin-bottom: 10px;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] * {
cursor: pointer;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"]:last-of-type {
margin-bottom: 0;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"] {
display: none;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"]+label::after {
content: none;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"]:checked+label::after {
border-color: #ffffff;
content: "";
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"]:checked+label::before {
background: #10bf7a;
border-color: #10bf7a;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] label {
position: relative;
display: inline-block;
padding-left: 28px;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] label::before,
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] label::after {
position: absolute;
content: "";
display: inline-block;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] label::before {
height: 16px;
width: 16px;
border: 1px solid #e3e3e3;
background: #ffffff;
left: 0px;
top: 3px;
}
.formkit-form[data-uid="96680ccf0e"] [data-group="checkboxes"] [data-group="checkbox"] label::after {
height: 4px;
width: 8px;
border-left: 2px solid #4d4d4d;
border-bottom: 2px solid #4d4d4d;
-webkit-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
transform: rotate(-45deg);
left: 4px;
top: 8px;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-alert {
background: #f9fafb;
border: 1px solid #e3e3e3;
border-radius: 5px;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
list-style: none;
margin: 25px auto;
padding: 12px;
text-align: center;
width: 100%;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-alert:empty {
display: none;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-alert-success {
background: #d3fbeb;
border-color: #10bf7a;
color: #0c905c;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-alert-error {
background: #fde8e2;
border-color: #f2643b;
color: #ea4110;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-spinner {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
height: 0px;
width: 0px;
margin: 0 auto;
position: absolute;
top: 0;
left: 0;
right: 0;
width: 0px;
overflow: hidden;
text-align: center;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-spinner>div {
margin: auto;
width: 12px;
height: 12px;
background-color: #fff;
opacity: 0.3;
border-radius: 100%;
display: inline-block;
-webkit-animation: formkit-bouncedelay-formkit-form-data-uid-96680ccf0e- 1.4s infinite ease-in-out both;
animation: formkit-bouncedelay-formkit-form-data-uid-96680ccf0e- 1.4s infinite ease-in-out both;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-spinner>div:nth-child(1) {
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-spinner>div:nth-child(2) {
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-submit[data-active] .formkit-spinner {
opacity: 1;
height: 100%;
width: 50px;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-submit[data-active] .formkit-spinner~span {
opacity: 0;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-powered-by[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit-container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 100%;
margin: 10px 0;
position: relative;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit-container[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit {
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
background-color: #ffffff;
border-radius: 9px;
color: #3d3d3d;
cursor: pointer;
display: block;
height: 36px;
margin: 0 auto;
opacity: 0.95;
padding: 0;
-webkit-text-decoration: none;
text-decoration: none;
text-indent: 100%;
-webkit-transition: ease-in-out all 200ms;
transition: ease-in-out all 200ms;
white-space: nowrap;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
width: 157px;
background-repeat: no-repeat;
background-position: center;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='133' height='36' viewBox='0 0 133 36' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.861 25.5C0.735 25.5 0.651 25.416 0.651 25.29V10.548C0.651 10.422 0.735 10.338 0.861 10.338H6.279C9.072 10.338 10.668 11.451 10.668 13.824C10.668 15.819 9.219 16.932 8.001 17.226C7.707 17.268 7.707 17.625 8.022 17.688C9.912 18.108 11.088 19.116 11.088 21.321C11.088 23.715 9.429 25.5 6.426 25.5H0.861ZM5.397 23.085C6.825 23.085 7.518 22.224 7.518 21.006C7.518 19.683 6.825 18.948 5.397 18.948H4.2V23.085H5.397ZM5.313 16.617C6.51 16.617 7.245 15.945 7.245 14.601C7.245 13.383 6.51 12.753 5.25 12.753H4.2V16.617H5.313ZM17.9758 23.883C17.9758 23.568 17.6608 23.505 17.5348 23.799C17.0308 24.954 16.1698 25.731 14.5528 25.731C12.8728 25.731 12.0958 24.471 12.0958 22.707V14.937C12.0958 14.811 12.1798 14.727 12.3058 14.727H15.2248C15.3508 14.727 15.4348 14.811 15.4348 14.937V21.657C15.4348 22.581 15.7708 23.022 16.4638 23.022C17.1778 23.022 17.6188 22.581 17.6188 21.657V14.937C17.6188 14.811 17.7028 14.727 17.8288 14.727H20.7478C20.8738 14.727 20.9578 14.811 20.9578 14.937V25.29C20.9578 25.416 20.8738 25.5 20.7478 25.5H18.1858C18.0598 25.5 17.9758 25.416 17.9758 25.29V23.883ZM25.6141 25.29C25.6141 25.416 25.5301 25.5 25.4041 25.5H22.4851C22.3591 25.5 22.2751 25.416 22.2751 25.29V14.937C22.2751 14.811 22.3591 14.727 22.4851 14.727H25.4041C25.5301 14.727 25.6141 14.811 25.6141 14.937V25.29ZM23.9131 13.74C22.8001 13.74 22.0441 12.942 22.0441 11.934C22.0441 10.926 22.8001 10.107 23.9131 10.107C25.0051 10.107 25.7611 10.926 25.7611 11.934C25.7611 12.942 25.0051 13.74 23.9131 13.74ZM26.7883 10.548C26.7883 10.422 26.8723 10.338 26.9983 10.338H29.9173C30.0433 10.338 30.1273 10.422 30.1273 10.548V22.056C30.1273 22.749 30.2533 23.085 30.8203 23.085C31.0093 23.085 31.1983 23.043 31.3663 23.001C31.5133 22.959 31.6183 22.959 31.6183 23.127V25.059C31.6183 25.164 31.5763 25.269 31.4923 25.311C30.9673 25.521 30.2953 25.71 29.5813 25.71C27.7123 25.71 26.7883 24.639 26.7883 22.476V10.548ZM32.4237 14.727C32.8227 14.727 32.9277 14.538 32.9697 14.055L33.1167 12.039C33.1167 11.913 33.2217 11.829 33.3477 11.829H35.8887C36.0147 11.829 36.0987 11.913 36.0987 12.039V14.517C36.0987 14.643 36.1827 14.727 36.3087 14.727H38.2827C38.4087 14.727 38.4927 14.811 38.4927 14.937V16.659C38.4927 16.785 38.4087 16.869 38.2827 16.869H36.0777V22.056C36.0777 22.875 36.5397 23.085 37.0647 23.085C37.4847 23.085 37.9467 22.938 38.3247 22.707C38.4717 22.623 38.5767 22.665 38.5767 22.833V24.828C38.5767 24.933 38.5347 25.017 38.4507 25.08C37.8417 25.458 36.9807 25.71 36.0357 25.71C34.2927 25.71 32.7387 24.912 32.7387 22.476V16.869H31.8567C31.7307 16.869 31.6467 16.785 31.6467 16.659V14.937C31.6467 14.811 31.7307 14.727 31.8567 14.727H32.4237ZM51.3808 14.727C51.5068 14.727 51.5908 14.79 51.6118 14.916L52.3888 19.851L52.5778 21.174C52.6198 21.468 52.9558 21.468 52.9768 21.174C53.0398 20.712 53.0818 20.271 53.1658 19.83L53.8798 14.916C53.9008 14.79 53.9848 14.727 54.1108 14.727H56.6728C56.8198 14.727 56.8828 14.811 56.8618 14.958L54.6778 25.311C54.6568 25.437 54.5728 25.5 54.4468 25.5H51.3178C51.1918 25.5 51.1078 25.437 51.0868 25.311L50.1208 20.082L49.8898 18.633C49.8688 18.444 49.6588 18.444 49.6378 18.633L49.4068 20.103L48.5458 25.311C48.5248 25.437 48.4408 25.5 48.3148 25.5H45.2068C45.0808 25.5 44.9968 25.437 44.9758 25.311L42.8128 14.958C42.7918 14.811 42.8548 14.727 43.0018 14.727H45.9628C46.0888 14.727 46.1728 14.79 46.1938 14.916L46.9288 19.83C47.0128 20.271 47.0758 20.754 47.1388 21.195C47.2018 21.51 47.4748 21.531 47.5378 21.195L47.7478 19.872L48.6088 14.916C48.6298 14.79 48.7138 14.727 48.8398 14.727H51.3808ZM61.1582 25.29C61.1582 25.416 61.0742 25.5 60.9482 25.5H58.0292C57.9032 25.5 57.8192 25.416 57.8192 25.29V14.937C57.8192 14.811 57.9032 14.727 58.0292 14.727H60.9482C61.0742 14.727 61.1582 14.811 61.1582 14.937V25.29ZM59.4572 13.74C58.3442 13.74 57.5882 12.942 57.5882 11.934C57.5882 10.926 58.3442 10.107 59.4572 10.107C60.5492 10.107 61.3052 10.926 61.3052 11.934C61.3052 12.942 60.5492 13.74 59.4572 13.74ZM62.8154 14.727C63.2144 14.727 63.3194 14.538 63.3614 14.055L63.5084 12.039C63.5084 11.913 63.6134 11.829 63.7394 11.829H66.2804C66.4064 11.829 66.4904 11.913 66.4904 12.039V14.517C66.4904 14.643 66.5744 14.727 66.7004 14.727H68.6744C68.8004 14.727 68.8844 14.811 68.8844 14.937V16.659C68.8844 16.785 68.8004 16.869 68.6744 16.869H66.4694V22.056C66.4694 22.875 66.9314 23.085 67.4564 23.085C67.8764 23.085 68.3384 22.938 68.7164 22.707C68.8634 22.623 68.9684 22.665 68.9684 22.833V24.828C68.9684 24.933 68.9264 25.017 68.8424 25.08C68.2334 25.458 67.3724 25.71 66.4274 25.71C64.6844 25.71 63.1304 24.912 63.1304 22.476V16.869H62.2484C62.1224 16.869 62.0384 16.785 62.0384 16.659V14.937C62.0384 14.811 62.1224 14.727 62.2484 14.727H62.8154ZM73.4298 16.323C73.4298 16.638 73.7868 16.68 73.9128 16.407C74.3748 15.315 75.1308 14.496 76.6008 14.496C78.2178 14.496 78.9528 15.609 78.9528 17.373V25.29C78.9528 25.416 78.8688 25.5 78.7428 25.5H75.8238C75.6978 25.5 75.6138 25.416 75.6138 25.29V18.633C75.6138 17.709 75.2778 17.268 74.5848 17.268C73.8708 17.268 73.4298 17.709 73.4298 18.633V25.29C73.4298 25.416 73.3458 25.5 73.2198 25.5H70.3008C70.1748 25.5 70.0908 25.416 70.0908 25.29V10.548C70.0908 10.422 70.1748 10.338 70.3008 10.338H73.2198C73.3458 10.338 73.4298 10.422 73.4298 10.548V16.323Z' fill='%231E1E1E'/%3E%3Cpath d='M100.132 16.3203C105.58 17.3761 107.272 22.4211 107.318 27.4961C107.318 27.6101 107.226 27.7041 107.112 27.7041H100.252C100.138 27.7041 100.046 27.6121 100.046 27.5001C100.026 23.5629 99.3877 20.0896 95.4865 19.9396C95.3705 19.9356 95.2725 20.0276 95.2725 20.1456V27.5001C95.2725 27.6141 95.1806 27.7061 95.0666 27.7061H88.206C88.092 27.7061 88 27.6141 88 27.5001V8.75585C88 8.64187 88.092 8.54989 88.206 8.54989H95.0686C95.1826 8.54989 95.2745 8.64187 95.2745 8.75585V15.7764C95.2745 15.8804 95.3585 15.9644 95.4625 15.9644C95.5445 15.9644 95.6185 15.9104 95.6425 15.8324C97.4081 10.0416 100.709 8.58588 106.07 8.55189C106.184 8.55189 106.276 8.64387 106.276 8.75785V15.7604C106.276 15.8744 106.184 15.9664 106.07 15.9664H100.166C100.066 15.9664 99.9856 16.0464 99.9856 16.1464C99.9856 16.2304 100.048 16.3043 100.132 16.3203ZM118.918 20.7095V16.1704C118.918 16.0564 119.01 15.9644 119.124 15.9644H124.173C124.273 15.9644 124.353 15.8844 124.353 15.7844C124.353 15.6985 124.291 15.6245 124.207 15.6085C120.256 14.8246 118.432 12.5511 118.37 8.75585C118.368 8.64387 118.458 8.54989 118.572 8.54989H125.986C126.1 8.54989 126.192 8.64187 126.192 8.75585V11.9532C126.192 12.0672 126.284 12.1592 126.398 12.1592H130.649C130.763 12.1592 130.855 12.2511 130.855 12.3651V15.7624C130.855 15.8764 130.763 15.9684 130.649 15.9684H126.398C126.284 15.9684 126.192 16.0604 126.192 16.1744V19.8356C126.192 21.1294 126.986 21.5553 128.04 21.5553C129.692 21.5553 131.323 20.8114 131.977 20.4735C132.113 20.4035 132.277 20.5015 132.277 20.6555V26.3543C132.277 26.5063 132.193 26.6463 132.059 26.7183C131.413 27.0582 129.418 28 127.136 28C122.435 27.996 118.918 26.0824 118.918 20.7095ZM109.266 27.4981V16.1704C109.266 16.0564 109.358 15.9644 109.472 15.9644H116.334C116.448 15.9644 116.54 16.0564 116.54 16.1704V27.4981C116.54 27.6121 116.448 27.7041 116.334 27.7041H109.472C109.358 27.7021 109.266 27.6101 109.266 27.4981ZM108.876 11.4913C108.876 13.4189 110.238 14.9826 112.853 14.9826C115.469 14.9826 116.83 13.4189 116.83 11.4913C116.83 9.56369 115.471 8 112.853 8C110.238 8 108.876 9.56369 108.876 11.4913Z' fill='%231E1E1E'/%3E%3C/svg%3E");
}
.formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit:hover,
.formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit:focus {
background-color: #ffffff;
-webkit-transform: scale(1.025) perspective(1px);
-ms-transform: scale(1.025) perspective(1px);
transform: scale(1.025) perspective(1px);
opacity: 1;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit[data-variant="dark"],
.formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit[data-variant="light"] {
background-color: transparent;
border-color: transparent;
width: 133px;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit[data-variant="light"] {
color: #ffffff;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='133' height='36' viewBox='0 0 133 36' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.861 25.5C0.735 25.5 0.651 25.416 0.651 25.29V10.548C0.651 10.422 0.735 10.338 0.861 10.338H6.279C9.072 10.338 10.668 11.451 10.668 13.824C10.668 15.819 9.219 16.932 8.001 17.226C7.707 17.268 7.707 17.625 8.022 17.688C9.912 18.108 11.088 19.116 11.088 21.321C11.088 23.715 9.429 25.5 6.426 25.5H0.861ZM5.397 23.085C6.825 23.085 7.518 22.224 7.518 21.006C7.518 19.683 6.825 18.948 5.397 18.948H4.2V23.085H5.397ZM5.313 16.617C6.51 16.617 7.245 15.945 7.245 14.601C7.245 13.383 6.51 12.753 5.25 12.753H4.2V16.617H5.313ZM17.9758 23.883C17.9758 23.568 17.6608 23.505 17.5348 23.799C17.0308 24.954 16.1698 25.731 14.5528 25.731C12.8728 25.731 12.0958 24.471 12.0958 22.707V14.937C12.0958 14.811 12.1798 14.727 12.3058 14.727H15.2248C15.3508 14.727 15.4348 14.811 15.4348 14.937V21.657C15.4348 22.581 15.7708 23.022 16.4638 23.022C17.1778 23.022 17.6188 22.581 17.6188 21.657V14.937C17.6188 14.811 17.7028 14.727 17.8288 14.727H20.7478C20.8738 14.727 20.9578 14.811 20.9578 14.937V25.29C20.9578 25.416 20.8738 25.5 20.7478 25.5H18.1858C18.0598 25.5 17.9758 25.416 17.9758 25.29V23.883ZM25.6141 25.29C25.6141 25.416 25.5301 25.5 25.4041 25.5H22.4851C22.3591 25.5 22.2751 25.416 22.2751 25.29V14.937C22.2751 14.811 22.3591 14.727 22.4851 14.727H25.4041C25.5301 14.727 25.6141 14.811 25.6141 14.937V25.29ZM23.9131 13.74C22.8001 13.74 22.0441 12.942 22.0441 11.934C22.0441 10.926 22.8001 10.107 23.9131 10.107C25.0051 10.107 25.7611 10.926 25.7611 11.934C25.7611 12.942 25.0051 13.74 23.9131 13.74ZM26.7883 10.548C26.7883 10.422 26.8723 10.338 26.9983 10.338H29.9173C30.0433 10.338 30.1273 10.422 30.1273 10.548V22.056C30.1273 22.749 30.2533 23.085 30.8203 23.085C31.0093 23.085 31.1983 23.043 31.3663 23.001C31.5133 22.959 31.6183 22.959 31.6183 23.127V25.059C31.6183 25.164 31.5763 25.269 31.4923 25.311C30.9673 25.521 30.2953 25.71 29.5813 25.71C27.7123 25.71 26.7883 24.639 26.7883 22.476V10.548ZM32.4237 14.727C32.8227 14.727 32.9277 14.538 32.9697 14.055L33.1167 12.039C33.1167 11.913 33.2217 11.829 33.3477 11.829H35.8887C36.0147 11.829 36.0987 11.913 36.0987 12.039V14.517C36.0987 14.643 36.1827 14.727 36.3087 14.727H38.2827C38.4087 14.727 38.4927 14.811 38.4927 14.937V16.659C38.4927 16.785 38.4087 16.869 38.2827 16.869H36.0777V22.056C36.0777 22.875 36.5397 23.085 37.0647 23.085C37.4847 23.085 37.9467 22.938 38.3247 22.707C38.4717 22.623 38.5767 22.665 38.5767 22.833V24.828C38.5767 24.933 38.5347 25.017 38.4507 25.08C37.8417 25.458 36.9807 25.71 36.0357 25.71C34.2927 25.71 32.7387 24.912 32.7387 22.476V16.869H31.8567C31.7307 16.869 31.6467 16.785 31.6467 16.659V14.937C31.6467 14.811 31.7307 14.727 31.8567 14.727H32.4237ZM51.3808 14.727C51.5068 14.727 51.5908 14.79 51.6118 14.916L52.3888 19.851L52.5778 21.174C52.6198 21.468 52.9558 21.468 52.9768 21.174C53.0398 20.712 53.0818 20.271 53.1658 19.83L53.8798 14.916C53.9008 14.79 53.9848 14.727 54.1108 14.727H56.6728C56.8198 14.727 56.8828 14.811 56.8618 14.958L54.6778 25.311C54.6568 25.437 54.5728 25.5 54.4468 25.5H51.3178C51.1918 25.5 51.1078 25.437 51.0868 25.311L50.1208 20.082L49.8898 18.633C49.8688 18.444 49.6588 18.444 49.6378 18.633L49.4068 20.103L48.5458 25.311C48.5248 25.437 48.4408 25.5 48.3148 25.5H45.2068C45.0808 25.5 44.9968 25.437 44.9758 25.311L42.8128 14.958C42.7918 14.811 42.8548 14.727 43.0018 14.727H45.9628C46.0888 14.727 46.1728 14.79 46.1938 14.916L46.9288 19.83C47.0128 20.271 47.0758 20.754 47.1388 21.195C47.2018 21.51 47.4748 21.531 47.5378 21.195L47.7478 19.872L48.6088 14.916C48.6298 14.79 48.7138 14.727 48.8398 14.727H51.3808ZM61.1582 25.29C61.1582 25.416 61.0742 25.5 60.9482 25.5H58.0292C57.9032 25.5 57.8192 25.416 57.8192 25.29V14.937C57.8192 14.811 57.9032 14.727 58.0292 14.727H60.9482C61.0742 14.727 61.1582 14.811 61.1582 14.937V25.29ZM59.4572 13.74C58.3442 13.74 57.5882 12.942 57.5882 11.934C57.5882 10.926 58.3442 10.107 59.4572 10.107C60.5492 10.107 61.3052 10.926 61.3052 11.934C61.3052 12.942 60.5492 13.74 59.4572 13.74ZM62.8154 14.727C63.2144 14.727 63.3194 14.538 63.3614 14.055L63.5084 12.039C63.5084 11.913 63.6134 11.829 63.7394 11.829H66.2804C66.4064 11.829 66.4904 11.913 66.4904 12.039V14.517C66.4904 14.643 66.5744 14.727 66.7004 14.727H68.6744C68.8004 14.727 68.8844 14.811 68.8844 14.937V16.659C68.8844 16.785 68.8004 16.869 68.6744 16.869H66.4694V22.056C66.4694 22.875 66.9314 23.085 67.4564 23.085C67.8764 23.085 68.3384 22.938 68.7164 22.707C68.8634 22.623 68.9684 22.665 68.9684 22.833V24.828C68.9684 24.933 68.9264 25.017 68.8424 25.08C68.2334 25.458 67.3724 25.71 66.4274 25.71C64.6844 25.71 63.1304 24.912 63.1304 22.476V16.869H62.2484C62.1224 16.869 62.0384 16.785 62.0384 16.659V14.937C62.0384 14.811 62.1224 14.727 62.2484 14.727H62.8154ZM73.4298 16.323C73.4298 16.638 73.7868 16.68 73.9128 16.407C74.3748 15.315 75.1308 14.496 76.6008 14.496C78.2178 14.496 78.9528 15.609 78.9528 17.373V25.29C78.9528 25.416 78.8688 25.5 78.7428 25.5H75.8238C75.6978 25.5 75.6138 25.416 75.6138 25.29V18.633C75.6138 17.709 75.2778 17.268 74.5848 17.268C73.8708 17.268 73.4298 17.709 73.4298 18.633V25.29C73.4298 25.416 73.3458 25.5 73.2198 25.5H70.3008C70.1748 25.5 70.0908 25.416 70.0908 25.29V10.548C70.0908 10.422 70.1748 10.338 70.3008 10.338H73.2198C73.3458 10.338 73.4298 10.422 73.4298 10.548V16.323Z' fill='white'/%3E%3Cpath d='M100.132 16.3203C105.58 17.3761 107.272 22.4211 107.318 27.4961C107.318 27.6101 107.226 27.7041 107.112 27.7041H100.252C100.138 27.7041 100.046 27.6121 100.046 27.5001C100.026 23.5629 99.3877 20.0896 95.4865 19.9396C95.3705 19.9356 95.2725 20.0276 95.2725 20.1456V27.5001C95.2725 27.6141 95.1806 27.7061 95.0666 27.7061H88.206C88.092 27.7061 88 27.6141 88 27.5001V8.75585C88 8.64187 88.092 8.54989 88.206 8.54989H95.0686C95.1826 8.54989 95.2745 8.64187 95.2745 8.75585V15.7764C95.2745 15.8804 95.3585 15.9644 95.4625 15.9644C95.5445 15.9644 95.6185 15.9104 95.6425 15.8324C97.4081 10.0416 100.709 8.58588 106.07 8.55189C106.184 8.55189 106.276 8.64387 106.276 8.75785V15.7604C106.276 15.8744 106.184 15.9664 106.07 15.9664H100.166C100.066 15.9664 99.9856 16.0464 99.9856 16.1464C99.9856 16.2304 100.048 16.3043 100.132 16.3203ZM118.918 20.7095V16.1704C118.918 16.0564 119.01 15.9644 119.124 15.9644H124.173C124.273 15.9644 124.353 15.8844 124.353 15.7844C124.353 15.6985 124.291 15.6245 124.207 15.6085C120.256 14.8246 118.432 12.5511 118.37 8.75585C118.368 8.64387 118.458 8.54989 118.572 8.54989H125.986C126.1 8.54989 126.192 8.64187 126.192 8.75585V11.9532C126.192 12.0672 126.284 12.1592 126.398 12.1592H130.649C130.763 12.1592 130.855 12.2511 130.855 12.3651V15.7624C130.855 15.8764 130.763 15.9684 130.649 15.9684H126.398C126.284 15.9684 126.192 16.0604 126.192 16.1744V19.8356C126.192 21.1294 126.986 21.5553 128.04 21.5553C129.692 21.5553 131.323 20.8114 131.977 20.4735C132.113 20.4035 132.277 20.5015 132.277 20.6555V26.3543C132.277 26.5063 132.193 26.6463 132.059 26.7183C131.413 27.0582 129.418 28 127.136 28C122.435 27.996 118.918 26.0824 118.918 20.7095ZM109.266 27.4981V16.1704C109.266 16.0564 109.358 15.9644 109.472 15.9644H116.334C116.448 15.9644 116.54 16.0564 116.54 16.1704V27.4981C116.54 27.6121 116.448 27.7041 116.334 27.7041H109.472C109.358 27.7021 109.266 27.6101 109.266 27.4981ZM108.876 11.4913C108.876 13.4189 110.238 14.9826 112.853 14.9826C115.469 14.9826 116.83 13.4189 116.83 11.4913C116.83 9.56369 115.471 8 112.853 8C110.238 8 108.876 9.56369 108.876 11.4913Z' fill='white'/%3E%3C/svg%3E");
}
@-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-96680ccf0e- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
@keyframes formkit-bouncedelay-formkit-form-data-uid-96680ccf0e- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
.formkit-form[data-uid="96680ccf0e"] blockquote {
padding: 10px 20px;
margin: 0 0 20px;
border-left: 5px solid #e1e1e1;
}
.formkit-form[data-uid="96680ccf0e"] .seva-custom-content {
padding: 15px;
font-size: 16px;
color: #fff;
mix-blend-mode: difference;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-modal.guard {
max-width: 420px;
width: 100%;
}
.formkit-form[data-uid="96680ccf0e"] {
max-width: 700px;
}
.formkit-form[data-uid="96680ccf0e"] [data-style="clean"] {
width: 100%;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-fields {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
margin: 0 auto;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-field,
.formkit-form[data-uid="96680ccf0e"] .formkit-submit {
margin: 0 0 15px 0;
-webkit-flex: 1 0 100%;
-ms-flex: 1 0 100%;
flex: 1 0 100%;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-powered-by-convertkit-container {
margin: 0;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-submit {
position: static;
}
.formkit-form[data-uid="96680ccf0e"][min-width~="700"] [data-style="clean"],
.formkit-form[data-uid="96680ccf0e"][min-width~="800"] [data-style="clean"] {
padding: 10px;
padding-top: 56px;
}
.formkit-form[data-uid="96680ccf0e"][min-width~="700"] .formkit-fields[data-stacked="false"],
.formkit-form[data-uid="96680ccf0e"][min-width~="800"] .formkit-fields[data-stacked="false"] {
margin-left: -5px;
margin-right: -5px;
}
.formkit-form[data-uid="96680ccf0e"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-field,
.formkit-form[data-uid="96680ccf0e"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-field,
.formkit-form[data-uid="96680ccf0e"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-submit,
.formkit-form[data-uid="96680ccf0e"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-submit {
margin: 0 5px 15px 5px;
}
.formkit-form[data-uid="96680ccf0e"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-field,
.formkit-form[data-uid="96680ccf0e"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-field {
-webkit-flex: 100 1 auto;
-ms-flex: 100 1 auto;
flex: 100 1 auto;
}
.formkit-form[data-uid="96680ccf0e"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-submit,
.formkit-form[data-uid="96680ccf0e"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-submit {
-webkit-flex: 1 1 auto;
-ms-flex: 1 1 auto;
flex: 1 1 auto;
}
.formkit-form[data-uid="96680ccf0e"] .formkit-fields button {
padding-top: 4px;
padding-bottom: 4px;
}
</style>
</form>
Text Content
Existing customer? Login here Login Can I have a sample? I'm Ready to Purchase LEARN HOW TO TEST REAL, COMPLEX SOFTWARE WRITTEN IN GO LARGE OR SMALL, PERFECT ABSTRACTIONS OR GLOBAL STATE GALORE; IT DOESN'T MATTER WHAT YOUR CODE LOOKS LIKE, YOU CAN LEARN TO TEST IT. Tell me if this sounds familiar - you are learning how to test in Go, and things seem to be going great. The tutorials are all clicking, and you can't wait to start applying what you are learning in your real projects. You fire up your editor, grab your latest project, create your first *_test.go source file, and suddenly it feels like you don't have a clue what you are doing. *You hear the sound of glass shattering* WHAT HAPPENED?!?! Things were going so great. All those examples made sense, but now you don't even know where to start. It seemed so easy to test that "Hello, world" HTTP handler, but how do you test complex handlers? You know, HTTP handlers that do something realistic like insert a record into a database, or use an API to verify someone's address. For that matter, how do we verify that our database interactions are working as we expected? Or maybe your app has a global DB variable - does that mean testing simply isn't possible? What about those APIs we are interacting with? Do we stub them? Do we hit the test API? What happens if we hit API rate limits or there isn't even a test API? Alright, alright! Take a second to breathe and let me fill you in on a little secret... TESTING ISN'T HARD, BUT SIMPLE TUTORIALS DON'T DO IT JUSTICE Testing isn't any harder than writing any other Go code. In fact, if we wanted we could test our code by just writing a main package and interacting with our application code. We could panic when something doesn't act the way we expected, and viola - we have a test! But why does it feel so hard? Probably because we simplify the examples to the point that they lose all of their value. Think about it, when is the last time you wrote a Palindrome function? Never? So why are all these tutorials showing us how to test one? Why aren't they showing us how to test realistic software? What happened to the example where we test a real HTTP handler that needs access to a data store? Or the tutorial where we build an API client and learn how to test it WITHOUT always hitting the real API. Wouldn't it be great if we could learn how to test a real web app with a real DB and a real integration to a payments API like Stripe? TEST WITH GO IS DIFFERENT. In this course you will learn how to test REAL software, not palindrome functions. We will have to look at a few isolated examples in order to learn specific testing techniques, but that isn't enough to solidify a concept so we won't stop there. We will build real projects that teach you how to apply all of these testing skills in real software. In one project we build a web application which allows us to address the complexities that come up while testing an application that uses a database, third party APIs, and more. In another project we look at how internal testing helps us verify our intermediate steps are correct, while also discussing the downside to testing unexported functions. You will learn about common pitfalls to avoid in order to write more testable code. You will learn how to incrementally fix code that has already succumbed to many of these pitfalls, allowing you to avoid a massive PR that makes your reviewer cry inside. When you run into an application with a global DB variable you won't need to give up on testing. You will learn exactly how to make small, manageable changes to the code that allow you to start testing it almost immediately. The next time you are asked whether the data store should be mocked or if a real SQL database should be used you will be able to discuss the pros and cons of both approaches with your teammates and decide on a proper plan of action. After completing this course you will have the knowledge and the skills necessary to start testing your own projects. You will still have to put in the work, but the mystery, the confusion, and the frustration will be gone. In short, you will be on your way to becoming the de facto testing expert on your team. You will be on the path to making your team's software a happier, healthier place to spend your day. Heck, you might even be on your way to a raise or a better offer! 😉 Want a sample of the course? REQUEST A SAMPLE or learn about the course below COURSE OVERVIEW Test with Go is broken into two major sections: Lessons and Projects Put together, the lessons and projects span 173 videos and total over 33 hours of content. In the lessons we focus on learning the techniques necessary to test our applications. We will learn the basics, like how to write your first test and what table driven testing is, but we will also cover more advanced testing techniques like: * Testing race conditions * Dependency injection * Mocks, stubs, and fakes * Testing with HTTP * And many more! We will spend some time using small, isolated examples in order to learn each technique, but those will gradually become more realistic as you become familiar with testing. Before long we will be looking at tests that use a real SQL database, test helpers that enable us to test HTTP endpoints that require authentication, and more. In the projects we will take everything we learned in the lessons and practice applying them while building real software. We will look at some of the most common mistakes you can make when designing an application, as well as how to gradually refactor your code to make it more testable. We will see first-hand how to separate your integration and unit tests, allowing you to write tests for an API client that can both be run locally and online with the real API. We will even look at how to export some of those helper functions, making it easier for others who use your libraries to write tests. More can be seen in the individual Lessons and Projects sections below. “ ” I finished my internship this week. The knowledge I got from your book helped me get a better offer (compared to the average around here), and I'm glad. Thank you. Jonathan B. Software Engineer THE LESSONS The lessons consist of 88 videos that will gradually walk you from the most basic exercise - like writing your first test - all the way to advanced techniques like interface test suites, dependency injection, and more. All of the lessons are broken into sections, making it easier to quickly jump to the subject you want to learn or review. That means in a few years when you want a quick reminder on testing subprocesses you can quickly find the section you need and get back to testing your code with minimal downtime. SECTION 1: WHAT IS TESTING, AND WHY DOES IT MATTER? What is a test? Why do tests matter? Writing great tests SECTION 2: TESTS ARE JUST GO CODE Testing with a main package Testing with Gos testing package What happens when we run go test SECTION 3: NAMING CONVENTIONS File naming conventions Function naming conventions Variable naming conventions SECTION 4: FAILING TESTS Ways to signal test failure When to use Error vs Fatal Writing useful failure messages SECTION 5: EXAMPLES AS TEST CASES A basic example as a test case Viewing examples in the docs Unordered example output Complex examples Examples in the standard library SECTION 6: TESTING MULTIPLE CASES Table driven tests Generating table driven test code Subtests Shared setup and teardown TestMain SECTION 7: PARALLEL TESTS Running tests in parallel Parallel subtests Setup and teardown with parallel subtests Gotchas with closures and parallel tests SECTION 8: TESTING RACE CONDITIONS What is a race condition The race detection flag Testing explicitly for race conditions SECTION 9: COMPARING OBJECTS FOR EQUALITY Simple comparisons Reflect's DeepEqual function Golden files (brief overview) Helper comparison functions SECTION 10: TESTING UTILITIES Building things with helper functions Generating test data Gos quick testing package Public testing utilities SECTION 11: CONTROLLING WHICH TESTS ARE RUN Running specific tests Running tests for subpackages Skipping tests Custom flags Build tags SECTION 12: ADDITIONAL TESTING FLAGS Benchmarks Verbose testing Code coverage The timeout flag Parallel testing flags SECTION 13: EXTERNAL AND INTERNAL TESTING Differences between external and internal How to write internal and external tests When to use external tests Exporting unexported vars, funcs, and types When to use internal tests SECTION 14: TYPES OF TESTS Overview of test types Unit tests Integration tests End-to-end tests Which test type should I use SECTION 15: STATE What is global state Testing with global state (if you must) SECTION 16: DEPENDENCY INJECTION (DI) What is dependency injection DI enables implementation agnostic code DI makes testing easier DI and useful zero values Removing global state with DI Package level functions Summary of DI SECTION 17: MOCKS, STUBS, AND FAKES What is mocking Types of mock objects Why do we mock Third party packages Faking APIs SECTION 18: INTERFACE TEST SUITES What are interface test suites Interface test suite setup and teardown Interface test suites in the wild SECTION 19: TESTING WITH HTTP httptest.ResponseRecorder httptest.Server Build HTTP helpers SECTION 20: GOLDEN FILES What are golden files Updating golden files SECTION 21: TESTING SUBPROCESSES What is a subprocess Running the subprocess in tests Mocking simple subprocesses Mocking complex subprocesses SECTION 22: TESTING WITH TIME Why are dates and times problematic? Inject your time and sleep functions Testing timeouts SECTION 23: BONUS MATERIAL Colorizing your terminal output Coverage info function “ ” I realize you are looking for ways to improve, but I don’t have anything negative to say about the videos you sent me to review. I love your approach in these lessons. Everything is explained well and I can’t wait for the course release! Nestoras Stefanou Software Engineer THE PROJECTS There are three projects in this course: * form - a Go package (AKA a library) used to generate HTML forms from Go structs * stripe - an API client used to interact with a few of the Stripe payment API endpoints * swag - a web application that allows users to order sticker packs using both the form and stripe packages we create in the first two projects Each project is built from the ground up with the goal of teaching you about testing in real software. For instance, we will intentionally make mistakes that make our code hard to test then explore ways to make it more testable. Or in other instances we might discuss the tradeoffs of one approach vs another before ultimately moving forward and writing any code. The videos for each project are shown below, and if you have any questions don't hesitate to reach out and ask. *The projects are only included in the COMPLETE package PROJECT 1: FORM A Go package (AKA a library) used to generate HTML forms from Go structs 01. Topics covered in the form project 02. The first test 03. Our first bug 04. Handling multiple fields 05. Field values 06. Checking for specific attributes in a test 07. Unexported fields 08. Non-structs are invalid 09. Pointers to structs 10. Supporting more types 11. Generating HTML 12. Discussing struct tags and tests 13. Parsing struct tags 14. Applying struct tags 15. Golden test files 16. Struct tag tests in TestHTML 17. Rendering errors 18. Rendering errors 19. Detecting breaking changes with tests PROJECT 2: STRIPE An API client used to interact with a few of the Stripe payment API endpoints 01. The first test 02. Creating a customer 03. Versioning our client 04. Making the API key a flag 05. Improving our customer data 06. The charge endpoint 07. Custom error type 08. Parsing stripe errors 09. Customer endpoint errors 10. Starting on unit tests 11. Allowing customer http clients 12. Creating a recorder client 13. Persisting recorded responses 14. Making our tests cross-platform 15. Serving recorded responses 16. Unique customer per charge subtest 17. Adding tests for specific errors 18. Helper functions PROJECT 3: SWAG In this project we explore how we might approach adding tests and refactoring a web application that wasn't designed with testing in mind. We look at how to incrementally add tests and make changes so we avoid breaking any functionality or needing to make massive overhauls to the code. The web app we add tests to allows users to order sticker packs using both the form and stripe packages we create in the first two projects 01. What to expect 02. App overview 03. Initial db tests 04. Creating the db.Open function 05. What about mocks 06. Test harnesses and helpers 07. Reviewing tests 08. Testing specific times 09. First pass at refactoring the db pkg 10. Updating db tests 11. Testing the order flow 12. Extracting code for unit testing 13. Extracting the active campaign handler 14. Unit testing the active campaign handler 15. Table driven testing the active campaign handler 16. Refactoring campaign middleware 17. Unit testing the campaign middleware 18. Starting the orders handler 19. Testing the new order handler 20. Refactor Create order handler 21. Test: Create order handler 22. Integration testing with Stripe 23. Testing for specific Stripe failures 24. Another form of table driven tests 25. Refactor: Order middleware 26. Test: Order middleware 27. Refactor: Show order handler 28. Test: Show order handler 29. Don't get too clever 30. Integration testing the show order handler 31. Removing sql from the confirm order handler 32. Testing the database confirm order function 33. Refactor: Confirm order handler 34. Test: Confirm order handler with same address 35. Test: Confirm order handler when campaign isnt found 36. Refactoring and finishing the confirm order handler unit tests 37. Integration test: Confirm order handler 38. Setting the stripe secret key via ENV variable 39. Refactoring the routing code in main 40. Testing our asset directory 41. Mocks for testing our router 42. Testing the show order route 43. Table driven router testing 44. Additional router testing 45. Removing the tempDB type 46. Removing the DefaultDatabase package variable 47. Cleanup 48. Wrapping up “ ” I expected to learn some useful testing techniques and strategies, which I most definitely did, but thinking about what Jon teaches in this course has begun to change the way I think about writing code in general; an unexpected benefit. Thomas Software Engineer COURSE PACKAGES Complete Package Access to everything. The lessons, the projects, the source code, and future updates. 173 videos totalling over 33 hours of content. Stream or download the videos from any device. You could be learning to test with Go even when you don't have internet access! (Questions about the video format?) Access to all the source code used in the course Free course updates - anytime I update or add any new content you will get instant access to it. That include new lessons, projects, etc. Learn how to test a Stripe payments API integration Access to the exclusive Test with Go course Slack. Ask questions and learn with both me and others who purchased the course Get the Complete Package $249 Lessons Package Access to all the lessons and their corresponding source code. 88 videos totalling over 13 hours of content Stream the videos from any device Access to all the source code used in the lessons Free lesson updates - anytime I update the lessons you will get instant access to the updated material Access to the exclusive Test with Go course Slack. Ask questions and learn with both me and others who purchased the course Get the Lessons Package $149 BUYING MORE THAN ONE COPY? In addition to individual packages, I also offer team packages. These include everything in the complete package, but you get a discount for buying multiple copies. You can reach out to discuss a team package that fits your team's needs. “ ” You have the best practical learning materials available. I've been studying Go for more then one year and saw lots of materials. But yours stuff is the best! Alex D. Software Engineer FAQ FREQUENTLY ASKED QUESTIONS WHAT IF I DON'T LIKE IT? I offer a 30 day money back guarantee. If you are unsure about the course, I recommend purchasing the package you feel is best and streaming a few of the videos to see if the course is right for you. If it isn't, send me an email within 30 days and I'll issue you a refund. This only applies to the first time you purchase a course. I do not offer multiple refunds for the same course, so if you purchase a course, request a refund, then purchase it again I will not offer a second refund. This is because I am still charged the CC processing fee on a refund, and it isn't reasonable for me to eat that cost multiple times. I may also refuse a refund in extreme cases. For instance, if you buy the course, download a large portion of the videos, then request a refund. I have had issues with theft in the past, so I reserve the right to refuse a refund in cases like this. If you have any questions about this policy, please reach out before purchasing. I am genuinely trying to help people and will try to work with anyone, but a few bad actors have unfortunately made it hard to offer refunds without some restrictions. HOW LONG WILL I HAVE ACCESS TO THE COURSE? The course doesn't expire. Once you purchase, you will always have access to the videos. If you are worried, the complete package includes a way to download all the content so that you can back everything up on your own devices as well. You know, just in case I get hit by a truck or something. 🚛 *beep* *beep* WHAT FORMATS ARE THE VIDEOS IN? The videos are hosted with Vimeo and are streamable through their embedded player. If you purchase the complete package I also offer DRM-free, high quality 1920x1080 mp4s that you can download. WHERE IS THE SECTION ON TDD? The short answer? There isn't one. We use TDD some in the projects, but it isn't taught as a standalone concept. That said, everything taught in this course can be applied to TDD with relative ease. DO YOU OFFER STUDENT DISCOUNTS? Yes, students of any kind (high school, college, bootcamp, whatever else) can send me an email with any sort of proof you are a student and I'll send you a link to purchase the course with the student discount. DO YOU OFFER TEAM PACKAGES? Yes, I offer team packages. These include everything in the complete package, but you get a discount for buying multiple copies. Reach out for more info - jon@calhoun.io. ABOUT THE AUTHOR Jon Calhoun is a full stack web developer who teaches about Go, web development, testing, algorithms, and anything else he finds interesting. He spoke at the GothamGo conference about focusing on simplicity when writing software and is a panelist on the Go Time podcast. Previously, Jon founded EasyPost, a shipping API that many fortune 500 companies use to power their shipping infrastructure. Before that he worked at Google as a software engineer. Before that he studied computer science at UCF. You can find more of Jon's work, including other FREE courses and tutorials he has created, below. * Gophercises (FREE course) * Algorithms with Go (FREE course) * Web Development with Go * Calhoun.io * Errors in Go * Let's Learn Algorithms Test with Go was created by @joncalhoun. The awesome gophers you see above were designed by @egonelbre and slightly tweaked by me (if you see a mistake, it was probably me). © Jon Calhoun 2018. All rights reserved.