miniSql

创建
zgc123@gmail.com authored at 11/19/2023 1:40:15 AM
6136600
Tree
0 Parent(s)
Summary: 1 changed files with 144 additions and 0 deletions.
Added +144 -0
Added +144 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Tests/DbModel/SqlCeSchemaService_Tests.cs b/minisqlquery-master/src/MiniSqlQuery.Tests/DbModel/SqlCeSchemaService_Tests.cs
new file mode 100644
index 0000000..4373388
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Tests/DbModel/SqlCeSchemaService_Tests.cs
@@ -0,0 +1,144 @@
+#region License
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+using System;
+using MiniSqlQuery.Core.DbModel;
+using NUnit.Framework;
+
+
+// ReSharper disable InconsistentNaming
+
+namespace MiniSqlQuery.Tests.DbModel
+{
+    [TestFixture(Description = "Requires SQLCE DB")]
+    [Category("Functional")]
+    public class SqlCeSchemaService_Tests
+    {
+        #region Setup/Teardown
+
+        [SetUp]
+        public void TestSetup()
+        {
+            _service = new SqlCeSchemaService { ProviderName = _providerName };
+            _model = _service.GetDbObjectModel(_connStr);
+        }
+
+        #endregion
+
+        private SqlCeSchemaService _service;
+        private string _connStr = @"data source=|DataDirectory|\Northwind.v4.sdf";
+        private string _providerName = "System.Data.SqlServerCe.4.0";
+        private DbModelInstance _model;
+
+        [Test]
+        public void Has_Customers_table()
+        {
+            Assert.That(_model.FindTable("[Customers]"), Is.Not.Null);
+        }
+
+        [Test]
+        public void Has_Categories_table()
+        {
+            Assert.That(_model.FindTable("[Categories]"), Is.Not.Null);
+        }
+
+        [Test]
+        public void Customers_table_has_columns()
+        {
+            var table = _model.FindTable("[Customers]");
+            Assert.That(table.Columns[0].Name, Is.EqualTo("Customer ID"));
+            Assert.That(table.Columns[0].DbType.Name, Is.EqualTo("nvarchar"));
+            Assert.That(table.Columns[0].DbType.Length, Is.EqualTo(5));
+
+            Assert.That(table.PrimaryKeyColumns.Count, Is.EqualTo(1));
+        }
+
+        [Test]
+        public void Check_FK_refs_for_Products()
+        {
+            var table = _model.FindTable("[Products]");
+            var supplierIdColumn = table.Columns[1];
+            var categoryIdColumn = table.Columns[2];
+            var productNameColumn = table.Columns[3];
+
+            Assert.That(table.Columns.Count, Is.EqualTo(11));
+            Assert.That(table.PrimaryKeyColumns.Count, Is.EqualTo(1));
+            Assert.That(table.ForeignKeyColumns.Count, Is.EqualTo(2));
+            Assert.That(table.NonKeyColumns.Count, Is.EqualTo(8));
+
+            Assert.That(supplierIdColumn.ForeignKeyReference, Is.Not.Null);
+            Assert.That(categoryIdColumn.ForeignKeyReference, Is.Not.Null);
+
+            Assert.That(supplierIdColumn.ForeignKeyReference.OwningColumn.Name, Is.EqualTo("Supplier ID"));
+            Assert.That(supplierIdColumn.ForeignKeyReference.ReferenceTable.Name, Is.EqualTo("Suppliers"));
+            Assert.That(supplierIdColumn.ForeignKeyReference.ReferenceColumn.Name, Is.EqualTo("Supplier ID"));
+            Assert.That(supplierIdColumn.ForeignKeyReference.UpdateRule, Is.EqualTo("CASCADE"));
+            Assert.That(supplierIdColumn.ForeignKeyReference.DeleteRule, Is.EqualTo("NO ACTION"));
+            Assert.That(supplierIdColumn.HasFK, Is.True);
+
+            Assert.That(categoryIdColumn.ForeignKeyReference.OwningColumn.Name, Is.EqualTo("Category ID"));
+            Assert.That(categoryIdColumn.ForeignKeyReference.ReferenceTable.Name, Is.EqualTo("Categories"));
+            Assert.That(categoryIdColumn.ForeignKeyReference.ReferenceColumn.Name, Is.EqualTo("Category ID"));
+            Assert.That(categoryIdColumn.ForeignKeyReference.UpdateRule, Is.EqualTo("CASCADE"));
+            Assert.That(categoryIdColumn.ForeignKeyReference.DeleteRule, Is.EqualTo("NO ACTION"));
+
+            Assert.That(productNameColumn.HasFK, Is.False);
+            Assert.That(productNameColumn.Name, Is.EqualTo("Product Name"));
+        }
+
+
+        [Test]
+        public void Build_dependency_tree_from_model()
+        {
+            DbModelDependencyWalker dependencyWalker = new DbModelDependencyWalker(_model);
+            var tables = dependencyWalker.SortTablesByForeignKeyReferences();
+
+            DisplayTableDetails(tables);
+            /*
+                Categories (fks:0)
+                Customers (fks:0)
+                Employees (fks:0)
+                Order Details_New (fks:0)
+                Shippers (fks:0)
+                Suppliers (fks:0)
+                Orders (fks:3)
+                  (FK --> Customers.Customer ID)
+                  (FK --> Employees.Employee ID)
+                  (FK --> Shippers.Shipper ID)
+                Products (fks:2)
+                  (FK --> Suppliers.Supplier ID)
+                  (FK --> Categories.Category ID)
+                Order Details (fks:2)
+                  (FK --> Orders.Order ID)
+                  (FK --> Products.Product ID)
+             */
+
+            Assert.That(tables[0].Name, Is.EqualTo("Categories"));
+            Assert.That(tables[1].Name, Is.EqualTo("Customers"));
+            Assert.That(tables[2].Name, Is.EqualTo("Employees"));
+            Assert.That(tables[4].Name, Is.EqualTo("Shippers"));
+            Assert.That(tables[5].Name, Is.EqualTo("Suppliers"));
+            Assert.That(tables[6].Name, Is.EqualTo("Orders"), "Order is dependent on Customers, Employees, Shippers");
+            Assert.That(tables[7].Name, Is.EqualTo("Products"), "Products is dependent on Suppliers, Categories");
+            Assert.That(tables[8].Name, Is.EqualTo("Order Details"), "Order Details is dependent on Orders, Products");
+        }
+
+        private void DisplayTableDetails(DbModelTable[] tablesList)
+        {
+            foreach (DbModelTable table in tablesList)
+            {
+                Console.WriteLine(string.Format("{0} (fks:{1})", table.Name, table.ForeignKeyColumns.Count));
+                if (table.ForeignKeyColumns.Count > 0)
+                {
+                    foreach (DbModelColumn fk in table.ForeignKeyColumns)
+                    {
+                        Console.WriteLine("  (FK --> {0}.{1})", fk.ForeignKeyReference.ReferenceTable.Name, fk.ForeignKeyReference.ReferenceColumn.Name);
+
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file