Skip to content

Commit e8c1119

Browse files
author
Jareth Hein
committed
Implement the beginnings of unit tests (table creation, round trip test of most value types), correct a few comments in the code, and using new unit tests, correct interpretation of some of the date/time types.
1 parent da0ee79 commit e8c1119

12 files changed

+314
-16
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22
Intuit.QuickBase.Client/obj/
33
Intuit.QuickBase.Core/obj/
44
QBFunctionTest/obj/
5+
QBFunctionTest/app.config
6+
TestResults/

Intuit.QuickBase.Client/QAddress.cs

+4
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,9 @@ public QAddress(string line1, string line2, string city, string province, string
1818
PostalCode = postCode;
1919
Country = country;
2020
}
21+
22+
public QAddress()
23+
{
24+
}
2125
}
2226
}

Intuit.QuickBase.Client/QColumnCollection.cs

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public QColumnCollection(IQApplication application, IQTable table)
2828
{
2929
var addCol = new AddField(Application.Client.Ticket, Application.Token, Application.Client.AccountDomain, Table.TableId, column.ColumnName, column.ColumnType);
3030
var xml = addCol.Post().CreateNavigator();
31+
//todo: need to put in error checking here
3132
var columnId = int.Parse(xml.SelectSingleNode("/qdbapi/fid").Value);
3233
column.ColumnId = columnId;
3334
}

Intuit.QuickBase.Client/QField.cs

+13-13
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,8 @@ internal string QBValue
6161
case FieldType.date:
6262
return ConvertDateTimeToQBMilliseconds((DateTime)_value);
6363
case FieldType.timeofday:
64-
return ConvertTimeSpanToQBMilliseconds((TimeSpan)_value);
6564
case FieldType.duration:
66-
return ((TimeSpan)_value).Milliseconds.ToString();
65+
return ((TimeSpan) _value).ToString();
6766
case FieldType.checkbox:
6867
return (bool)_value == true ? "1" : "0";
6968
case FieldType.percent:
@@ -80,13 +79,13 @@ internal string QBValue
8079
// do nothing: child columns will fill this out
8180
break;
8281
case FieldType.date:
83-
_value = String.IsNullOrEmpty(value) ? new DateTime?() : ConvertQBMillisecondsToDateTime(value).Date;
82+
_value = String.IsNullOrEmpty(value) ? new DateTime?() : ConvertQBMillisecondsToDate(value);
8483
break;
8584
case FieldType.timeofday:
86-
_value = String.IsNullOrEmpty(value) ? new TimeSpan?() : ConvertQBMillisecondsToDateTime(value).TimeOfDay;
85+
_value = String.IsNullOrEmpty(value) ? new TimeSpan?() : ConvertQBMillisecondsToTime(value);
8786
break;
8887
case FieldType.duration:
89-
_value = String.IsNullOrEmpty(value) ? new TimeSpan?() : TimeSpan.FromMilliseconds(Int64.Parse(value));
88+
_value = String.IsNullOrEmpty(value) ? new TimeSpan?() : TimeSpan.Parse(value);
9089
break;
9190
case FieldType.timestamp:
9291
_value = String.IsNullOrEmpty(value) ? new DateTime?() : ConvertQBMillisecondsToDateTime(value);
@@ -246,17 +245,18 @@ private static DateTime ConvertQBMillisecondsToDateTime(string milliseconds)
246245
{
247246
return qbTSOffset.AddMilliseconds(double.Parse(milliseconds)).ToLocalTime();
248247
}
248+
private static DateTime ConvertQBMillisecondsToDate(string milliseconds)
249+
{
250+
return qbTSOffset.AddMilliseconds(double.Parse(milliseconds)).Date;
251+
}
252+
private static TimeSpan ConvertQBMillisecondsToTime(string milliseconds)
253+
{
254+
return qbTSOffset.AddMilliseconds(double.Parse(milliseconds)).TimeOfDay;
255+
}
249256

250257
private static string ConvertDateTimeToQBMilliseconds(DateTime inDT)
251258
{
252-
//string msecs = ((inDT.ToUniversalTime().Ticks - qbTSOffset.Ticks) / TimeSpan.TicksPerMillisecond).ToString(); // this SHOULD work, why?
253-
string msecs = ((inDT.Ticks - qbTSOffset.Ticks) / TimeSpan.TicksPerMillisecond).ToString();
254-
//DateTime check = ConvertQBMillisecondsToDateTime(msecs);
255-
//if (!check.Equals(inDT))
256-
//{
257-
// Console.WriteLine("DateTime doesn't round trip?");
258-
//}
259-
return msecs;
259+
return ((inDT.Ticks - qbTSOffset.Ticks) / TimeSpan.TicksPerMillisecond).ToString();
260260
}
261261

262262
private static string ConvertTimeSpanToQBMilliseconds(TimeSpan inTime)

Intuit.QuickBase.Client/QTable.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public void Query()
173173
.SetFmt(true)
174174
.Build();
175175
var xml = doQuery.Post().CreateNavigator();
176-
LoadColumns(xml); //Must be done each time, incase the schema changes do to another user
176+
LoadColumns(xml); //Must be done each time, incase the schema changes due to another user, or from a previous query that has a difering subset of columns
177177
LoadRecords(xml);
178178
}
179179

QBFunctionTest/Properties/Settings.Designer.cs

+71
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version='1.0' encoding='utf-8'?>
2+
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="QBFunctionTest.Properties" GeneratedClassName="Settings">
3+
<Profiles />
4+
<Settings>
5+
<Setting Name="qbUser" Type="System.String" Scope="Application">
6+
<Value Profile="(Default)">***REMOVED***</Value>
7+
</Setting>
8+
<Setting Name="qbPass" Type="System.String" Scope="Application">
9+
<Value Profile="(Default)">***REMOVED***</Value>
10+
</Setting>
11+
<Setting Name="qbAppToken" Type="System.String" Scope="Application">
12+
<Value Profile="(Default)">***REMOVED***</Value>
13+
</Setting>
14+
<Setting Name="qbSiteURL" Type="System.String" Scope="Application">
15+
<Value Profile="(Default)">***REMOVED***</Value>
16+
</Setting>
17+
<Setting Name="qbAppDBID" Type="System.String" Scope="Application">
18+
<Value Profile="(Default)">***REMOVED***</Value>
19+
</Setting>
20+
</Settings>
21+
</SettingsFile>

QBFunctionTest/QBFunctionTest.csproj

+12
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@
5353
</Otherwise>
5454
</Choose>
5555
<ItemGroup>
56+
<Compile Include="Properties\Settings.Designer.cs">
57+
<AutoGen>True</AutoGen>
58+
<DesignTimeSharedInput>True</DesignTimeSharedInput>
59+
<DependentUpon>Settings.settings</DependentUpon>
60+
</Compile>
5661
<Compile Include="UnitTest1.cs" />
5762
<Compile Include="Properties\AssemblyInfo.cs" />
5863
</ItemGroup>
@@ -66,6 +71,13 @@
6671
<Name>Intuit.QuickBase.Core</Name>
6772
</ProjectReference>
6873
</ItemGroup>
74+
<ItemGroup>
75+
<None Include="app.config" />
76+
<None Include="Properties\Settings.settings">
77+
<Generator>SettingsSingleFileGenerator</Generator>
78+
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
79+
</None>
80+
</ItemGroup>
6981
<Choose>
7082
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
7183
<ItemGroup>

QBFunctionTest/UnitTest1.cs

+124-1
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,137 @@
11
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Intuit.QuickBase.Client;
5+
using Intuit.QuickBase.Core;
26
using Microsoft.VisualStudio.TestTools.UnitTesting;
7+
using QBFunctionTest.Properties;
38

49
namespace QBFunctionTest
510
{
611
[TestClass]
712
public class UnitTest1
813
{
14+
private IQApplication qbApp;
15+
16+
public void InitConnection()
17+
{
18+
var client = QuickBase.Login(Settings.Default.qbUser, Settings.Default.qbPass, Settings.Default.qbSiteURL);
19+
qbApp = client.Connect(Settings.Default.qbAppDBID, Settings.Default.qbAppToken);
20+
21+
}
22+
23+
class TestRecord
24+
{
25+
public string textVal;
26+
public decimal floatVal;
27+
public bool checkboxVal;
28+
public DateTime dateVal;
29+
public DateTime timeStampVal;
30+
public TimeSpan timeOfDayVal;
31+
public QAddress addressVal;
32+
public decimal currencyVal;
33+
public TimeSpan durationVal;
34+
public string emailVal;
35+
public string phoneVal;
36+
public decimal percentVal;
37+
38+
public TestRecord()
39+
{
40+
addressVal = new QAddress();
41+
}
42+
public void SetupTestValues()
43+
{
44+
textVal = "Test string #1";
45+
floatVal = (decimal)3452.54;
46+
checkboxVal = true;
47+
dateVal = new DateTime(2015, 04, 15);
48+
timeStampVal = new DateTime(1970, 02, 28, 23, 55, 00, DateTimeKind.Local);
49+
timeOfDayVal = new DateTime(2000, 1, 1, 12, 34, 56).TimeOfDay;
50+
durationVal = new TimeSpan(3, 4, 5, 6);
51+
addressVal.Line1 = "1313 Mockingbird Ln";
52+
addressVal.City = "Culver City";
53+
addressVal.Province = "CA";
54+
addressVal.PostalCode = "90120";
55+
addressVal.Country = "USA";
56+
}
57+
}
58+
959
[TestMethod]
10-
public void TestMethod1()
60+
public void BasicCreationAndRoundTripTest()
1161
{
62+
InitConnection();
63+
List<GrantedAppsInfo> appsLst = qbApp.GrantedDBs();
64+
foreach (var app in appsLst)
65+
{
66+
foreach (var tab in app.GrantedTables)
67+
{
68+
if (tab.Name == "APITestApp: APITestTable")
69+
{
70+
IQTable tbl = qbApp.GetTable(tab.Dbid);
71+
qbApp.DeleteTable(tbl);
72+
break;
73+
}
74+
}
75+
}
76+
77+
IQTable testTable = qbApp.NewTable("APITestTable", "dummyRec");
78+
testTable.Columns.Add(new QColumn("TextTest", FieldType.text));
79+
testTable.Columns.Add(new QColumn("FloatTest", FieldType.@float));
80+
testTable.Columns.Add(new QColumn("CheckboxTest", FieldType.checkbox));
81+
testTable.Columns.Add(new QColumn("DateTest", FieldType.date));
82+
testTable.Columns.Add(new QColumn("TimeStampTest", FieldType.timestamp));
83+
testTable.Columns.Add(new QColumn("TimeOfDayTest", FieldType.timeofday));
84+
testTable.Columns.Add(new QColumn("DurationTest", FieldType.duration));
85+
//testTable.Columns.Add(new QColumn("AddressTest", FieldType.address));
86+
//testTable.Columns.Add(new QColumn("CurrencyTest", FieldType.currency));
87+
//testTable.Columns.Add(new QColumn("EmailTest", FieldType.email));
88+
//testTable.Columns.Add(new QColumn("PhoneTest", FieldType.phone));
89+
//testTable.Columns.Add(new QColumn("PercentTest", FieldType.percent));
90+
91+
TestRecord exemplar = new TestRecord();
92+
exemplar.SetupTestValues();
93+
94+
IQRecord inRec = testTable.NewRecord();
95+
inRec["TextTest"] = exemplar.textVal;
96+
inRec["FloatTest"] = exemplar.floatVal;
97+
inRec["CheckboxTest"] = exemplar.checkboxVal;
98+
inRec["DateTest"] = exemplar.dateVal;
99+
inRec["TimeStampTest"] = exemplar.timeStampVal;
100+
inRec["TimeOfDayTest"] = exemplar.timeOfDayVal;
101+
//inRec["DurationTest"] = exemplar.durationVal;
102+
//inRec["AddressTest"] = exemplar.addressVal;
103+
104+
Assert.AreEqual(exemplar.textVal, inRec["TextTest"], "Strings setter fails");
105+
Assert.AreEqual(exemplar.floatVal, inRec["FloatTest"], "Floats setter fails");
106+
Assert.AreEqual(exemplar.checkboxVal, inRec["CheckboxTest"], "Checkboxes setter fails");
107+
Assert.AreEqual(exemplar.dateVal, inRec["DateTest"], "Dates setter fails");
108+
Assert.AreEqual(exemplar.timeStampVal, inRec["TimeStampTest"], "TimeStamps setter fails");
109+
Assert.AreEqual(exemplar.timeOfDayVal, inRec["TimeOfDayTest"], "TimeOfDays setter fails");
110+
//Assert.AreEqual(exemplar.durationVal, inRec["DurationTest"], "Durations setter fails");
111+
112+
testTable.Records.Add(inRec);
113+
testTable.AcceptChanges();
114+
115+
Assert.AreEqual(exemplar.textVal, inRec["TextTest"], "Strings wrong post upload");
116+
Assert.AreEqual(exemplar.floatVal, inRec["FloatTest"], "Floats wrong post upload");
117+
Assert.AreEqual(exemplar.checkboxVal, inRec["CheckboxTest"], "Checkboxes wrong post upload");
118+
Assert.AreEqual(exemplar.dateVal, inRec["DateTest"], "Dates wrong post upload");
119+
Assert.AreEqual(exemplar.timeStampVal, inRec["TimeStampTest"], "TimeStamps wrong post upload");
120+
Assert.AreEqual(exemplar.timeOfDayVal, inRec["TimeOfDayTest"], "TimeOfDays wrong post upload");
121+
//Assert.AreEqual(exemplar.durationVal, inRec["DurationTest"], "Durations wrong post upload");
122+
123+
testTable.Records.Clear();
124+
testTable.Query();
125+
126+
IQRecord outRec = testTable.Records[0];
127+
Assert.AreEqual(exemplar.textVal, outRec["TextTest"], "Strings don't roundtrip");
128+
Assert.AreEqual(exemplar.floatVal, outRec["FloatTest"], "Floats don't roundtrip");
129+
Assert.AreEqual(exemplar.checkboxVal, outRec["CheckboxTest"], "Checkboxes don't roundtrip");
130+
Assert.AreEqual(exemplar.dateVal, outRec["DateTest"], "Dates don't roundtrip");
131+
Assert.AreEqual(exemplar.timeStampVal, outRec["TimeStampTest"], "TimeStamps don't roundtrip");
132+
Assert.AreEqual(exemplar.timeOfDayVal, outRec["TimeOfDayTest"], "TimeOfDays don't roundtrip");
133+
//Assert.AreEqual(exemplar.durationVal, outRec["DurationTest"], "Durations don't roundtrip");
134+
12135
}
13136
}
14137
}

QBFunctionTest/app.config.example

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<configuration>
3+
<configSections>
4+
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
5+
<section name="QBFunctionTest.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
6+
</sectionGroup>
7+
</configSections>
8+
<applicationSettings>
9+
<QBFunctionTest.Properties.Settings>
10+
<setting name="qbUser" serializeAs="String">
11+
<value>[email protected]</value>
12+
</setting>
13+
<setting name="qbPass" serializeAs="String">
14+
<value>VeryStrongPassword1234!@#$</value>
15+
</setting>
16+
<setting name="qbAppToken" serializeAs="String">
17+
<value>apptokenfromqbgoeshere</value>
18+
</setting>
19+
<setting name="qbSiteURL" serializeAs="String">
20+
<value>example.quickbase.com</value>
21+
</setting>
22+
<setting name="qbAppDBID" serializeAs="String">
23+
<value>appdatabaseidfromqbgoeshere</value>
24+
</setting>
25+
</QBFunctionTest.Properties.Settings>
26+
</applicationSettings>
27+
</configuration>

0 commit comments

Comments
 (0)