Posted by Michael Horvath under Technology  Test Automation  .Net Web API  on Sep 02 2022

You may have already downloaded our nuget package and want some additional assistance in getting started using HSS_API_Store_SDK. Below you will find a unit test code snippet that demonstrates calls to the methods provided in our nuget package. Be sure to scroll through the entire post there is more after the following code.

 
using HSS_API_Store_SDK;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Configuration;
using System.Threading.Tasks;
using static HSS_API_Store_SDK.apiResponsePasswords;
using static HSS_API_Store_SDK.apiResponseFoods;
using static HSS_API_Store_SDK.apiResponsePeople;

namespace HSS_API_Store_SDK_UnitTests
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public async Task TestMethod1()
        {
            var apiResponse = await Passwords.GetPasswordsAsync(ConfigurationManager.AppSettings.Get("HSS_API_Store_EmailAddress"), 
                ConfigurationManager.AppSettings.Get("HSS_API_Store_PasswordsKey"), 10, 20, 8, "", true, RequiredSymbols.Digits);

            Assert.IsNotNull(apiResponse);
            Assert.IsNotNull(apiResponse.passwordValues);
            Assert.AreEqual(ResponseEnumPasswords.Success, apiResponse.responseStatus);
            Assert.AreEqual(9, apiResponse.passwordValues.GetUpperBound(0));

            foreach(var password in apiResponse.passwordValues)
            {
                Console.WriteLine(password);
            }
        }

        [TestMethod]
        public async Task TestMethod2()
        {
            var apiResponse = await Passwords.GetPasswordsAsync(ConfigurationManager.AppSettings.Get("HSS_API_Store_EmailAddress"), 
                ConfigurationManager.AppSettings.Get("HSS_API_Store_PasswordsKey"), PasswordCharacterSelection: RequiredSymbols.Digits);

            Assert.IsNotNull(apiResponse);
            Assert.IsNotNull(apiResponse.passwordValues);
            Assert.AreEqual(ResponseEnumPasswords.Success, apiResponse.responseStatus);
            Assert.AreEqual(0, apiResponse.passwordValues.GetUpperBound(0));

            foreach (var password in apiResponse.passwordValues)
            {
                Console.WriteLine(password);
            }
        }

        [TestMethod]
        public async Task TestMethod3()
        {
            var apiResponse = await Foods.GetFoodsAsync(ConfigurationManager.AppSettings.Get("HSS_API_Store_EmailAddress"), 
                ConfigurationManager.AppSettings.Get("HSS_API_Store_FoodsKey"));

            Assert.IsNotNull(apiResponse);
            Assert.IsNotNull(apiResponse.foodsList);
            Assert.AreEqual(ResponseEnumFoods.Success, apiResponse.responseStatus);
            Assert.AreEqual(0, apiResponse.foodsList.ToArray().GetUpperBound(0));

            foreach (var food in apiResponse.foodsList)
            {
                Console.WriteLine(food.foodInformation.Name);
            }
        }

        [TestMethod]
        public async Task TestMethod4()
        {
            var apiResponse = await Foods.GetFoodsAsync(ConfigurationManager.AppSettings.Get("HSS_API_Store_EmailAddress"),
                ConfigurationManager.AppSettings.Get("HSS_API_Store_FoodsKey"), 20, "goat's milk");

            Assert.IsNotNull(apiResponse);
            Assert.IsNotNull(apiResponse.foodsList);
            Assert.AreEqual(ResponseEnumFoods.Success, apiResponse.responseStatus);
            Assert.AreEqual(19, apiResponse.foodsList.ToArray().GetUpperBound(0));

            foreach (var food in apiResponse.foodsList)
            {
                Console.WriteLine(food.foodInformation.BrandName + " " + food.foodInformation.Name + " " + food.foodInformation.HouseholdServing);
                Console.WriteLine(food.foodInformation.Ingredients);
                Console.WriteLine(" ");
            }
        }

        [TestMethod]
        public async Task TestMethod5()
        {
            var apiResponse = await People.GetPeopleAsync(ConfigurationManager.AppSettings.Get("HSS_API_Store_EmailAddress"), 
                ConfigurationManager.AppSettings.Get("HSS_API_Store_PeopleKey"), 5, StateSelection: StateIDEnum.AR);

            Assert.IsNotNull(apiResponse);
            Assert.IsNotNull(apiResponse.peopleList);
            Assert.AreEqual(ResponseEnumPeople.Success, apiResponse.responseStatus);
            Assert.AreEqual(4, apiResponse.peopleList.ToArray().GetUpperBound(0));

            foreach (var person in apiResponse.peopleList)
            {
                Console.WriteLine(person.Prefix + " " + person.FirstName + " " + person.LastName);
                Console.WriteLine(person.AddressLine1);
                if (person.AddressLine2 != null && person.AddressLine2 != "")
                    Console.WriteLine(person.AddressLine2);
                Console.WriteLine(person.City + ", " + person.StateID + " " + person.ZipCode);
                Console.WriteLine(person.PhoneNumber.FormatPhoneNumber());
                Console.WriteLine(" ");
            }
        }
    }
}



You will need to setup an app.config file in your project if you want to build this unit test code to define the AppSettings used in the code. Below is a sample app.config with placeholders in curly braces for your email and API keys. You can change these to the values you received when you requested API keys from our API Store.



  
    
    
    
    
  
  
    
      
        
        
      
    
  



Thank you for downloading our SDK and for reading our post!

Tagged --no tags--
Posted by Michael Horvath under Technology  Test Automation  .Net Web API  on Aug 21 2022


We have been working on .Net Web APIs that provide functionality that you may incorporate into your own application. As of this posting we have three APIs available: 1) GetFoodsAPI, 2) PasswordGeneratorAPI and 3) PeopleGeneratorAPI.

The get foods API will return records from the USDA Food Database used in our Food Allergy Checker. You may pass your criterion to the API to search the database for foods matching the criterion. We limit the result set to top {Count} parameter setting which allows values from 1 to 20.

The password generator can be used in a number of ways. Some examples are to generate access keys for your applications, to generate passwords to login to your various accounts, and more...

The people generator will generate random fictional people information that is useful for test automation where you need to test an application with fictitious people. This API is configurable to let you select the state you want the people to be located in. The addresses are made up randomly but do use actual city names and zip codes for more realistic data. The phone numbers are appropriate for the area code of the city the people are located in. The API could for example be consumed from a Selenium test automation using your code to call the API. We will work on examples of using this API to aid you in your development of these. Please check back later for future posts on the topic.

We hope you find these to be useful and look for future APIs to appear on the store site. Thanks for reading about our efforts and have a blessed day!

Tagged --no tags--
Posted by Michael Horvath under Technology  on Aug 09 2022

We make use of a script on our server that hosts our websites to encrypt our web.config and perform various other deployment tasks. For some time we have logged into the server to run this script after publishing our websites from Visual Studio. After doing this for a while we had the idea that Visual Studio should be able to execute our script once the website publish task is completed. We were using File System publish to deploy our website. Long story short, we failed to get the script to execute when our publish task completes. It turns out that this is not supported for File System publish.

After getting some rest from our attempts at implementing this, we decided to give it another try. This time we carefully read what we found from Google searches and found that web deploy of website does support execution of a script after publish completes. Here is what we learned: add the following to your .csproj file for the web application in Visual Studio just before the </Project> tag.

<Target Name="MyTarget" AfterTargets="MSDeployPublish">
     <Exec Command="cmd /c c:\Users\mjhorvath\deployall.bat" />
</Target>

The Exec Command may be any command you wish to use. In our case we execute a batch file script that makes a call to Power Shell to execute another script on our server that performs the tasks we need to complete deployment of the website.

We hope this saves you from duplicating our mistakes while developing this solution. Have a blessed day!

Visual Studio Screen Snapshot That Shows Start Of Script After Publish

Tagged --no tags--
Posted by Michael Horvath under Technology  on Aug 01 2022

Square Up has updated their SDK for payment processing and made a change that will obsolete the method we were using to take customer payments. We've updated our payment processing code to make use of the CheckoutApi CreatePaymentLinkAsync method. The Square Up SDK documentation for this does not include the client local variable definition so to help those who may want to use the same payment processing method we've included a code snippet from our Buy controller.

We hope this helps with your development efforts. Thanks for reading our post!

            
                if (tempProduct.SalePrice.HasValue)
                {
                    var client = new Square.SquareClient.Builder()
                        .Environment(Square.Environment.Production)
                        .AccessToken(ConfigurationManager.AppSettings["squareUpAPIKey"])
                        .Build();

                    var priceMoney = new Square.Models.Money.Builder()
                        .Amount((long?)(tempProduct.SalePrice * 100.0M))
                        .Currency("USD")
                        .Build();

                    var quickPay = new QuickPay.Builder(
                        name: tempProduct.FileName + " Activation Key",
                        priceMoney: priceMoney,
                        locationId: ConfigurationManager.AppSettings["HSS_squareUpLocationID"])
                      .Build();

                    var prePopulatedData = new PrePopulatedData.Builder()
                      .BuyerEmail(currentEmail)
                      .BuyerPhoneNumber("+1" + tblPRESSCustomer.PhoneNumber)
                      .Build();

                    var checkoutOptions = new CheckoutOptions.Builder()
                        .RedirectUrl(@"https://horvathsoftware.com/tblPRESSCustomerTransactionData/Success?activationKey=" + keyWeFound + @"&EmailAddress=" + currentEmail + @"&FileName=" + tempProduct.FileName + @"&customerID=" + customerID.ToString() + @"&transactionAmount=" + ((decimal)tempProduct.SalePrice).ToString())
                        .Build();

                    var body = new CreatePaymentLinkRequest.Builder()
                      .IdempotencyKey(NewIdempotencyKey())
                      .QuickPay(quickPay)
                      .PrePopulatedData(prePopulatedData)
                      .CheckoutOptions(checkoutOptions)
                      .Build();

                    try
                    {
                        var resultLink = await client.CheckoutApi.CreatePaymentLinkAsync(body: body);
                        int waitTime=3000;
                        HSS_DB_Settings.DBAppSettings.GetSettingInt32("waitToRedirectPayment", out waitTime);
                        System.Threading.Thread.Sleep(waitTime);
                        return Redirect(resultLink.PaymentLink.Url);
                    }
                    catch (ApiException e)
                    {
                        Console.WriteLine("Failed to make the request");
                        Console.WriteLine($"Response Code: {e.ResponseCode}");
                        Console.WriteLine($"Exception: {e.Message}");
                        goto returnView;
                    }
                }

Tagged --no tags--
Posted by Michael Horvath under Technology  PRESS News  on Jul 31 2022

Because there has been little interest in downloading our Windows Desktop Applications, we have removed the page with descriptions of our applications and links to our customer create page which allows entry to the actual download page. We aren't actively trying to pursue customers to download and use these applications to sustain our business. We do hope to provide freelance development to other small businesses and this is how we hope to sustain the business. The pages for downloading these applications and purchasing activation keys are still present on the main website to demo some of the capabilities that we have in development of both web applications and Windows Desktop Applications.

If you are interested in downloading one or more of our applications you may do so after entering your customer contact information by clicking this link, Download.

Password Randomizer with Encrypted Storage System (PRESS)

PRESS is a free password manager that will generate and store passwords for your various accounts. Your passwords are stored in a local vault file that is encrypted with AES-256 encryption using a master password you choose that if you wish is never stored anywhere on your PC or anywhere else. You may optionally create a secure vault key file that will allow you to access your passwords without typing in your master password. This free application has some capabilities limited, but for a fee an activation key may be purchased to unlock all of its features.

This is a sample of a hybrid winform/Windows Presentation Foundation (WPF) Windows application. Much of the user interface is done in winform with some WPF controls and WPF screens. This shows results of updating a winform application to include more modern controls available with WPF.

Windows Desktop Farkle Dice Game

Farkle is a free dice game that you can play on your Windows PC.

This is a sample of a WPF Windows application.

Screen Snapshots


Thanks and have a blessed day!

Tagged --no tags--

Next Page >>